| // 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. |
| |
| #ifndef V8_CODEGEN_CODE_DESC_H_ |
| #define V8_CODEGEN_CODE_DESC_H_ |
| |
| #include "src/common/globals.h" |
| |
| namespace v8 { |
| namespace internal { |
| |
| // A CodeDesc describes a buffer holding instructions and relocation |
| // information. The instructions start at the beginning of the buffer |
| // and grow forward, the relocation information starts at the end of |
| // the buffer and grows backward. Inlined metadata sections may exist |
| // at the end of the instructions. |
| // |
| // |<--------------- buffer_size ----------------------------------->| |
| // |<---------------- instr_size ------------->| |<-reloc_size->| |
| // |--------------+----------------------------+------+--------------| |
| // | instructions | data | free | reloc info | |
| // +--------------+----------------------------+------+--------------+ |
| |
| // TODO(jgruber): Add a single chokepoint for specifying the instruction area |
| // layout (i.e. the order of inlined metadata fields). |
| // TODO(jgruber): Systematically maintain inlined metadata offsets and sizes |
| // to simplify CodeDesc initialization. |
| |
| class CodeDesc { |
| public: |
| static void Initialize(CodeDesc* desc, Assembler* assembler, |
| int safepoint_table_offset, int handler_table_offset, |
| int constant_pool_offset, int code_comments_offset, |
| int reloc_info_offset); |
| |
| #ifdef DEBUG |
| static void Verify(const CodeDesc* desc); |
| #else |
| inline static void Verify(const CodeDesc* desc) {} |
| #endif |
| |
| public: |
| byte* buffer = nullptr; |
| int buffer_size = 0; |
| |
| // The instruction area contains executable code plus inlined metadata. |
| |
| int instr_size = 0; |
| |
| // Metadata packed into the instructions area. |
| |
| int safepoint_table_offset = 0; |
| int safepoint_table_size = 0; |
| |
| int handler_table_offset = 0; |
| int handler_table_size = 0; |
| |
| int constant_pool_offset = 0; |
| int constant_pool_size = 0; |
| |
| int code_comments_offset = 0; |
| int code_comments_size = 0; |
| |
| // TODO(jgruber,v8:11036): Remove these functions once CodeDesc fields have |
| // been made consistent with Code layout. |
| int body_size() const { return instr_size + unwinding_info_size; } |
| int instruction_size() const { return safepoint_table_offset; } |
| int metadata_size() const { return body_size() - instruction_size(); } |
| int safepoint_table_offset_relative() const { |
| return safepoint_table_offset - instruction_size(); |
| } |
| int handler_table_offset_relative() const { |
| return handler_table_offset - instruction_size(); |
| } |
| int constant_pool_offset_relative() const { |
| return constant_pool_offset - instruction_size(); |
| } |
| int code_comments_offset_relative() const { |
| return code_comments_offset - instruction_size(); |
| } |
| |
| // Relocation info is located at the end of the buffer and not part of the |
| // instructions area. |
| |
| int reloc_offset = 0; |
| int reloc_size = 0; |
| |
| // Unwinding information. |
| |
| byte* unwinding_info = nullptr; |
| int unwinding_info_size = 0; |
| int unwinding_info_offset_relative() const { |
| // TODO(jgruber,v8:11036): Remove this function once unwinding_info setup |
| // is more consistent with other metadata tables. |
| return code_comments_offset_relative() + code_comments_size; |
| } |
| |
| Assembler* origin = nullptr; |
| }; |
| |
| } // namespace internal |
| } // namespace v8 |
| |
| #endif // V8_CODEGEN_CODE_DESC_H_ |