1// Copyright 2022 the V8 project authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#ifndef V8_SNAPSHOT_EMBEDDED_EMBEDDED_DATA_INL_H_ 6#define V8_SNAPSHOT_EMBEDDED_EMBEDDED_DATA_INL_H_ 7 8#include "src/snapshot/embedded/embedded-data.h" 9 10namespace v8 { 11namespace internal { 12 13Address EmbeddedData::InstructionStartOfBuiltin(Builtin builtin) const { 14 DCHECK(Builtins::IsBuiltinId(builtin)); 15 const struct LayoutDescription& desc = LayoutDescription(builtin); 16 const uint8_t* result = RawCode() + desc.instruction_offset; 17 DCHECK_LT(result, code_ + code_size_); 18 return reinterpret_cast<Address>(result); 19} 20 21uint32_t EmbeddedData::InstructionSizeOfBuiltin(Builtin builtin) const { 22 DCHECK(Builtins::IsBuiltinId(builtin)); 23 const struct LayoutDescription& desc = LayoutDescription(builtin); 24 return desc.instruction_length; 25} 26 27Address EmbeddedData::MetadataStartOfBuiltin(Builtin builtin) const { 28 DCHECK(Builtins::IsBuiltinId(builtin)); 29 const struct LayoutDescription& desc = LayoutDescription(builtin); 30 const uint8_t* result = RawMetadata() + desc.metadata_offset; 31 DCHECK_LE(desc.metadata_offset, data_size_); 32 return reinterpret_cast<Address>(result); 33} 34 35uint32_t EmbeddedData::MetadataSizeOfBuiltin(Builtin builtin) const { 36 DCHECK(Builtins::IsBuiltinId(builtin)); 37 const struct LayoutDescription& desc = LayoutDescription(builtin); 38 return desc.metadata_length; 39} 40 41Address EmbeddedData::SafepointTableStartOf(Builtin builtin) const { 42 DCHECK(Builtins::IsBuiltinId(builtin)); 43 const struct LayoutDescription& desc = LayoutDescription(builtin); 44 const uint8_t* result = RawMetadata() + desc.metadata_offset; 45 DCHECK_LE(desc.handler_table_offset, data_size_); 46 return reinterpret_cast<Address>(result); 47} 48 49uint32_t EmbeddedData::SafepointTableSizeOf(Builtin builtin) const { 50 DCHECK(Builtins::IsBuiltinId(builtin)); 51 const struct LayoutDescription& desc = LayoutDescription(builtin); 52#if V8_EMBEDDED_CONSTANT_POOL 53 DCHECK_LE(desc.handler_table_offset, desc.constant_pool_offset); 54#else 55 DCHECK_LE(desc.handler_table_offset, desc.code_comments_offset_offset); 56#endif 57 return desc.handler_table_offset; 58} 59 60Address EmbeddedData::HandlerTableStartOf(Builtin builtin) const { 61 DCHECK(Builtins::IsBuiltinId(builtin)); 62 const struct LayoutDescription& desc = LayoutDescription(builtin); 63 const uint8_t* result = RawMetadata() + desc.handler_table_offset; 64 DCHECK_LE(desc.handler_table_offset, data_size_); 65 return reinterpret_cast<Address>(result); 66} 67 68uint32_t EmbeddedData::HandlerTableSizeOf(Builtin builtin) const { 69 DCHECK(Builtins::IsBuiltinId(builtin)); 70 const struct LayoutDescription& desc = LayoutDescription(builtin); 71#if V8_EMBEDDED_CONSTANT_POOL 72 DCHECK_LE(desc.handler_table_offset, desc.constant_pool_offset); 73 return desc.constant_pool_offset - desc.handler_table_offset; 74#else 75 DCHECK_LE(desc.handler_table_offset, desc.code_comments_offset_offset); 76 return desc.code_comments_offset_offset - desc.handler_table_offset; 77#endif 78} 79 80Address EmbeddedData::ConstantPoolStartOf(Builtin builtin) const { 81 DCHECK(Builtins::IsBuiltinId(builtin)); 82#if V8_EMBEDDED_CONSTANT_POOL 83 const struct LayoutDescription& desc = LayoutDescription(builtin); 84 const uint8_t* result = RawMetadata() + desc.constant_pool_offset; 85 DCHECK_LE(desc.constant_pool_offset, data_size_); 86 return reinterpret_cast<Address>(result); 87#else 88 return kNullAddress; 89#endif 90} 91 92uint32_t EmbeddedData::ConstantPoolSizeOf(Builtin builtin) const { 93 DCHECK(Builtins::IsBuiltinId(builtin)); 94#if V8_EMBEDDED_CONSTANT_POOL 95 const struct LayoutDescription& desc = LayoutDescription(builtin); 96 DCHECK_LE(desc.constant_pool_offset, desc.code_comments_offset_offset); 97 return desc.code_comments_offset_offset - desc.constant_pool_offset; 98#else 99 return 0; 100#endif 101} 102 103Address EmbeddedData::CodeCommentsStartOf(Builtin builtin) const { 104 DCHECK(Builtins::IsBuiltinId(builtin)); 105 const struct LayoutDescription& desc = LayoutDescription(builtin); 106 const uint8_t* result = RawMetadata() + desc.code_comments_offset_offset; 107 DCHECK_LE(desc.code_comments_offset_offset, data_size_); 108 return reinterpret_cast<Address>(result); 109} 110 111uint32_t EmbeddedData::CodeCommentsSizeOf(Builtin builtin) const { 112 DCHECK(Builtins::IsBuiltinId(builtin)); 113 const struct LayoutDescription& desc = LayoutDescription(builtin); 114 DCHECK_LE(desc.code_comments_offset_offset, 115 desc.unwinding_info_offset_offset); 116 return desc.unwinding_info_offset_offset - desc.code_comments_offset_offset; 117} 118 119Address EmbeddedData::UnwindingInfoStartOf(Builtin builtin) const { 120 DCHECK(Builtins::IsBuiltinId(builtin)); 121 const struct LayoutDescription& desc = LayoutDescription(builtin); 122 const uint8_t* result = RawMetadata() + desc.unwinding_info_offset_offset; 123 DCHECK_LE(desc.unwinding_info_offset_offset, data_size_); 124 return reinterpret_cast<Address>(result); 125} 126 127uint32_t EmbeddedData::UnwindingInfoSizeOf(Builtin builtin) const { 128 DCHECK(Builtins::IsBuiltinId(builtin)); 129 const struct LayoutDescription& desc = LayoutDescription(builtin); 130 DCHECK_LE(desc.unwinding_info_offset_offset, desc.metadata_length); 131 return desc.metadata_length - desc.unwinding_info_offset_offset; 132} 133 134Address EmbeddedData::InstructionStartOfBytecodeHandlers() const { 135 return InstructionStartOfBuiltin(Builtin::kFirstBytecodeHandler); 136} 137 138Address EmbeddedData::InstructionEndOfBytecodeHandlers() const { 139 STATIC_ASSERT(static_cast<int>(Builtin::kFirstBytecodeHandler) + 140 kNumberOfBytecodeHandlers + 141 2 * kNumberOfWideBytecodeHandlers == 142 Builtins::kBuiltinCount); 143 Builtin lastBytecodeHandler = Builtins::FromInt(Builtins::kBuiltinCount - 1); 144 return InstructionStartOfBuiltin(lastBytecodeHandler) + 145 InstructionSizeOfBuiltin(lastBytecodeHandler); 146} 147 148// Padded with kCodeAlignment. 149// TODO(v8:11045): Consider removing code alignment. 150uint32_t EmbeddedData::PaddedInstructionSizeOfBuiltin(Builtin builtin) const { 151 uint32_t size = InstructionSizeOfBuiltin(builtin); 152 CHECK_NE(size, 0); 153 return PadAndAlignCode(size); 154} 155 156} // namespace internal 157} // namespace v8 158 159#endif // V8_SNAPSHOT_EMBEDDED_EMBEDDED_DATA_INL_H_ 160