// Copyright 2020 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. // This file contains implementations of a few macros that are defined // as external in Torque, so that generated debug code can work. #ifndef V8_TORQUE_DEBUG_MACRO_SHIMS_H_ #define V8_TORQUE_DEBUG_MACRO_SHIMS_H_ #include "src/objects/smi.h" #include "tools/debug_helper/debug-helper-internal.h" // For Object::ReadField. #define READ_FIELD_OR_FAIL(Type, destination, accessor, object, offset) \ do { \ Type value{}; \ d::MemoryAccessResult validity = \ accessor(object - kHeapObjectTag + offset, \ reinterpret_cast(&value), sizeof(value)); \ if (validity != d::MemoryAccessResult::kOk) return {validity, {}}; \ destination = value; \ } while (false) // For TaggedField::load. #define READ_TAGGED_FIELD_OR_FAIL(destination, accessor, object, offset) \ do { \ Tagged_t value{}; \ d::MemoryAccessResult validity = \ accessor(object - kHeapObjectTag + offset, \ reinterpret_cast(&value), sizeof(value)); \ if (validity != d::MemoryAccessResult::kOk) return {validity, {}}; \ destination = EnsureDecompressed(value, object); \ } while (false) // Process Value struct. #define ASSIGN_OR_RETURN(dest, val) \ do { \ if ((val).validity != d::MemoryAccessResult::kOk) \ return {(val).validity, {}}; \ dest = (val).value; \ } while (false) namespace v8 { namespace internal { namespace debug_helper_internal { namespace TorqueDebugMacroShims { namespace CodeStubAssembler { inline Value BoolConstant(d::MemoryAccessor accessor, bool b) { return {d::MemoryAccessResult::kOk, b}; } inline Value ChangeInt32ToIntPtr(d::MemoryAccessor accessor, int32_t i) { return {d::MemoryAccessResult::kOk, i}; } inline Value ChangeUint32ToWord(d::MemoryAccessor accessor, uint32_t u) { return {d::MemoryAccessResult::kOk, u}; } inline Value IntPtrAdd(d::MemoryAccessor accessor, intptr_t a, intptr_t b) { return {d::MemoryAccessResult::kOk, a + b}; } inline Value IntPtrMul(d::MemoryAccessor accessor, intptr_t a, intptr_t b) { return {d::MemoryAccessResult::kOk, a * b}; } inline Value Signed(d::MemoryAccessor accessor, uintptr_t u) { return {d::MemoryAccessResult::kOk, static_cast(u)}; } inline Value SmiUntag(d::MemoryAccessor accessor, uintptr_t s_t) { Smi s(s_t); return {d::MemoryAccessResult::kOk, s.value()}; } inline Value UintPtrLessThan(d::MemoryAccessor accessor, uintptr_t a, uintptr_t b) { return {d::MemoryAccessResult::kOk, a < b}; } inline Value Unsigned(d::MemoryAccessor accessor, int32_t s) { return {d::MemoryAccessResult::kOk, static_cast(s)}; } #if V8_HOST_ARCH_64_BIT inline Value Unsigned(d::MemoryAccessor accessor, intptr_t s) { return {d::MemoryAccessResult::kOk, static_cast(s)}; } #endif inline Value Word32Equal(d::MemoryAccessor accessor, uint32_t a, uint32_t b) { return {d::MemoryAccessResult::kOk, a == b}; } inline Value Word32NotEqual(d::MemoryAccessor accessor, uint32_t a, uint32_t b) { return {d::MemoryAccessResult::kOk, a != b}; } } // namespace CodeStubAssembler } // namespace TorqueDebugMacroShims } // namespace debug_helper_internal } // namespace internal } // namespace v8 #endif // V8_TORQUE_DEBUG_MACRO_SHIMS_H_