blob: e051bb459c1af9ac74f06d087dd6c05c1110453b [file] [log] [blame]
// 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_