v8
V8 is Google’s open source high-performance JavaScript and WebAssembly engine, written in C++.
Loading...
Searching...
No Matches
code-reference.cc
Go to the documentation of this file.
1// Copyright 2018 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
6
11
12#if V8_ENABLE_WEBASSEMBLY
14#endif // V8_ENABLE_WEBASSEMBLY
15
16namespace v8 {
17namespace internal {
18
19namespace {
20
21struct CodeOps {
23
24 Address constant_pool() const { return code->constant_pool(); }
25 Address instruction_start() const { return code->instruction_start(); }
26 Address instruction_end() const { return code->instruction_end(); }
27 int instruction_size() const { return code->instruction_size(); }
28 const uint8_t* relocation_start() const { return code->relocation_start(); }
29 const uint8_t* relocation_end() const { return code->relocation_end(); }
30 int relocation_size() const { return code->relocation_size(); }
31 Address code_comments() const { return code->code_comments(); }
32 int code_comments_size() const { return code->code_comments_size(); }
33};
34
35#if V8_ENABLE_WEBASSEMBLY
36struct WasmCodeOps {
37 const wasm::WasmCode* code;
38
39 Address constant_pool() const { return code->constant_pool(); }
40 Address instruction_start() const {
41 return reinterpret_cast<Address>(code->instructions().begin());
42 }
43 Address instruction_end() const {
44 return reinterpret_cast<Address>(code->instructions().begin() +
45 code->instructions().size());
46 }
47 int instruction_size() const { return code->instructions().length(); }
48 const uint8_t* relocation_start() const { return code->reloc_info().begin(); }
49 const uint8_t* relocation_end() const {
50 return code->reloc_info().begin() + code->reloc_info().length();
51 }
52 int relocation_size() const { return code->reloc_info().length(); }
53 Address code_comments() const { return code->code_comments(); }
54 int code_comments_size() const { return code->code_comments_size(); }
55};
56#endif // V8_ENABLE_WEBASSEMBLY
57
58struct CodeDescOps {
59 const CodeDesc* code_desc;
60
61 Address constant_pool() const {
62 return instruction_start() + code_desc->constant_pool_offset;
63 }
64 Address instruction_start() const {
65 return reinterpret_cast<Address>(code_desc->buffer);
66 }
67 Address instruction_end() const {
68 return instruction_start() + code_desc->instr_size;
69 }
70 int instruction_size() const { return code_desc->instr_size; }
71 const uint8_t* relocation_start() const {
72 return code_desc->buffer + code_desc->reloc_offset;
73 }
74 const uint8_t* relocation_end() const {
75 return code_desc->buffer + code_desc->buffer_size;
76 }
77 int relocation_size() const { return code_desc->reloc_size; }
78 Address code_comments() const {
79 return instruction_start() + code_desc->code_comments_offset;
80 }
81 int code_comments_size() const { return code_desc->code_comments_size; }
82};
83} // namespace
84
85#if V8_ENABLE_WEBASSEMBLY
86#define HANDLE_WASM(...) __VA_ARGS__
87#else
88#define HANDLE_WASM(...) UNREACHABLE()
89#endif
90
91#define DISPATCH(ret, method) \
92 ret CodeReference::method() const { \
93 DCHECK(!is_null()); \
94 switch (kind_) { \
95 case Kind::CODE: \
96 return CodeOps{code_}.method(); \
97 case Kind::WASM_CODE: \
98 HANDLE_WASM(return WasmCodeOps{wasm_code_}.method()); \
99 case Kind::CODE_DESC: \
100 return CodeDescOps{code_desc_}.method(); \
101 default: \
102 UNREACHABLE(); \
103 } \
104 }
105
107DISPATCH(Address, instruction_start)
108DISPATCH(Address, instruction_end)
109DISPATCH(int, instruction_size)
110DISPATCH(const uint8_t*, relocation_start)
111DISPATCH(const uint8_t*, relocation_end)
112DISPATCH(int, relocation_size)
113DISPATCH(Address, code_comments)
114DISPATCH(int, code_comments_size)
115
116#undef DISPATCH
117#undef HANDLE_WASM
118
119} // namespace internal
120} // namespace v8
const CodeDesc * code_desc
#define DISPATCH(ret, method)
Handle< Code > code
uintptr_t Address
Definition memory.h:13
Node::Uses::const_iterator begin(const Node::Uses &uses)
Definition node.h:708
Local< T > Handle