| // Copyright 2019 the V8 project authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include 'src/builtins/builtins-regexp-gen.h' |
| |
| namespace internal_coverage { |
| |
| const kHasCoverageInfo: |
| constexpr int31 generates 'DebugInfo::kHasCoverageInfo'; |
| |
| const kFirstSlotIndex: |
| constexpr int31 generates 'CoverageInfo::kFirstSlotIndex'; |
| const kSlotBlockCountIndex: |
| constexpr int31 generates 'CoverageInfo::kSlotBlockCountIndex'; |
| const kSlotIndexCountLog2: |
| constexpr int31 generates 'CoverageInfo::kSlotIndexCountLog2'; |
| const kSlotIndexCountMask: |
| constexpr int31 generates 'CoverageInfo::kSlotIndexCountMask'; |
| |
| macro GetCoverageInfo(implicit context: Context)(function: JSFunction): |
| CoverageInfo labels IfNoCoverageInfo { |
| const shared: SharedFunctionInfo = function.shared_function_info; |
| const debugInfo = Cast<DebugInfo>(shared.script_or_debug_info) |
| otherwise goto IfNoCoverageInfo; |
| |
| if ((debugInfo.flags & kHasCoverageInfo) == 0) goto IfNoCoverageInfo; |
| return UnsafeCast<CoverageInfo>(debugInfo.coverage_info); |
| } |
| |
| @export // Silence unused warning on release builds. SlotCount is only used |
| // in an assert. TODO(szuend): Remove once macros and asserts work. |
| macro SlotCount(coverageInfo: CoverageInfo): Smi { |
| assert(kFirstSlotIndex == 0); // Otherwise we'd have to consider it below. |
| assert(kFirstSlotIndex == (coverageInfo.length & kSlotIndexCountMask)); |
| return coverageInfo.length >> kSlotIndexCountLog2; |
| } |
| |
| macro FirstIndexForSlot(implicit context: Context)(slot: Smi): Smi { |
| assert(kFirstSlotIndex == 0); // Otherwise we'd have to consider it below. |
| return slot << kSlotIndexCountLog2; |
| } |
| |
| macro IncrementBlockCount(implicit context: Context)( |
| coverageInfo: CoverageInfo, slot: Smi) { |
| assert(slot < SlotCount(coverageInfo)); |
| const slotStart: Smi = FirstIndexForSlot(slot); |
| const index: Smi = slotStart + kSlotBlockCountIndex; |
| coverageInfo.objects[index] = |
| UnsafeCast<Smi>(coverageInfo.objects[index]) + 1; |
| } |
| |
| builtin IncBlockCounter(implicit context: Context)( |
| function: JSFunction, coverageArraySlotIndex: Smi): Object { |
| // It's quite possible that a function contains IncBlockCounter bytecodes, |
| // but no coverage info exists. This happens e.g. by selecting the |
| // best-effort coverage collection mode, which triggers deletion of all |
| // coverage infos in order to avoid memory leaks. |
| |
| const coverageInfo: CoverageInfo = |
| GetCoverageInfo(function) otherwise return Undefined; |
| IncrementBlockCount(coverageInfo, coverageArraySlotIndex); |
| return Undefined; |
| } |
| |
| } // namespace internal_coverage |