v8
V8 is Google’s open source high-performance JavaScript and WebAssembly engine, written in C++.
Loading...
Searching...
No Matches
signature.h
Go to the documentation of this file.
1// Copyright 2015 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_CODEGEN_SIGNATURE_H_
6#define V8_CODEGEN_SIGNATURE_H_
7
8#include "src/base/hashing.h"
9#include "src/base/vector.h"
11#include "src/sandbox/check.h"
12#include "src/zone/zone.h"
13
14namespace v8 {
15namespace internal {
16
17template <typename SigT, typename T>
19 public:
20 SignatureBuilder(Zone* zone, size_t return_count, size_t parameter_count)
21 : return_count_(return_count),
23 rcursor_(0),
24 pcursor_(0) {
25 // Allocate memory for the signature plus the array backing the
26 // signature.
27 constexpr size_t padding = sizeof(SigT) % alignof(T);
28 using AllocationTypeTag = SignatureBuilder;
29 const size_t allocated_bytes =
30 sizeof(SigT) + padding + sizeof(T) * (return_count + parameter_count);
31 void* memory = zone->Allocate<AllocationTypeTag>(allocated_bytes);
32 uint8_t* rep_buffer =
33 reinterpret_cast<uint8_t*>(memory) + sizeof(SigT) + padding;
34 DCHECK(IsAligned(reinterpret_cast<uintptr_t>(rep_buffer), alignof(T)));
35 buffer_ = reinterpret_cast<T*>(rep_buffer);
36 sig_ = new (memory) SigT{return_count, parameter_count, buffer_};
37 }
38
39 const size_t return_count_;
40 const size_t parameter_count_;
41
42 void AddReturn(T val) {
44 buffer_[rcursor_++] = val;
45 }
46
47 void AddReturnAt(size_t index, T val) {
49 buffer_[index] = val;
50 rcursor_ = std::max(rcursor_, index + 1);
51 }
52
53 void AddParam(T val) {
56 }
57
58 void AddParamAt(size_t index, T val) {
61 pcursor_ = std::max(pcursor_, index + 1);
62 }
63
70
71 protected:
72 size_t rcursor_;
73 size_t pcursor_;
74 SigT* sig_;
76};
77
78// Describes the inputs and outputs of a function or call.
79template <typename T>
80class Signature : public ZoneObject {
81 public:
82 constexpr Signature(size_t return_count, size_t parameter_count,
83 const T* reps)
86 reps_(reps) {
90 static_assert(std::is_standard_layout<Signature<T>>::value);
91 }
92
93 size_t return_count() const { return return_count_; }
94 size_t parameter_count() const { return parameter_count_; }
95
96 T GetParam(size_t index) const {
97 // If heap memory is corrupted, we may get confused about the number of
98 // parameters during compilation. These SBXCHECKs defend against that.
100 return reps_[return_count_ + index];
101 }
102
103 T GetReturn(size_t index = 0) const {
105 return reps_[index];
106 }
107
108 bool contains(T element) const {
109 return std::find(all().cbegin(), all().cend(), element) != all().cend();
110 }
111
112 // Iteration support.
120
121 bool operator==(const Signature& other) const {
122 if (this == &other) return true;
123 if (parameter_count() != other.parameter_count()) return false;
124 if (return_count() != other.return_count()) return false;
125 return std::equal(all().begin(), all().end(), other.all().begin());
126 }
127 bool operator!=(const Signature& other) const { return !(*this == other); }
128
129 // For incrementally building signatures.
131
132 static Signature<T>* Build(Zone* zone, std::initializer_list<T> returns,
133 std::initializer_list<T> params) {
134 Builder builder(zone, returns.size(), params.size());
135 for (T ret : returns) builder.AddReturn(ret);
136 for (T param : params) builder.AddParam(param);
137 return builder.Get();
138 }
139
140 static constexpr size_t kReturnCountOffset = 0;
141 static constexpr size_t kParameterCountOffset =
143 static constexpr size_t kRepsOffset = kParameterCountOffset + kSizetSize;
144
145 protected:
148 const T* reps_;
149};
150
152
153template <typename T>
155 // Hash over all contained representations, plus the parameter count to
156 // differentiate signatures with the same representation array but different
157 // parameter/return count.
158 return base::Hasher{}.Add(sig.parameter_count()).AddRange(sig.all()).hash();
159}
160
161template <typename T, size_t kNumReturns = 0, size_t kNumParams = 0>
162class FixedSizeSignature : public Signature<T> {
163 public:
164 // Add return types to this signature (only allowed if there are none yet).
165 template <typename... ReturnTypes>
166 auto Returns(ReturnTypes... return_types) const {
167 static_assert(kNumReturns == 0, "Please specify all return types at once");
168 return FixedSizeSignature<T, sizeof...(ReturnTypes), kNumParams>{
169 std::initializer_list<T>{return_types...}.begin(), reps_};
170 }
171
172 // Add parameters to this signature (only allowed if there are none yet).
173 template <typename... ParamTypes>
174 auto Params(ParamTypes... param_types) const {
175 static_assert(kNumParams == 0, "Please specify all parameters at once");
176 return FixedSizeSignature<T, kNumReturns, sizeof...(ParamTypes)>{
177 reps_, std::initializer_list<T>{param_types...}.begin()};
178 }
179
180 private:
181 // Other template instantiations can call the private constructor.
182 template <typename T2, size_t kNumReturns2, size_t kNumParams2>
183 friend class FixedSizeSignature;
184
185 FixedSizeSignature(const T* returns, const T* params)
186 : Signature<T>(kNumReturns, kNumParams, reps_) {
187 std::copy(returns, returns + kNumReturns, reps_);
188 std::copy(params, params + kNumParams, reps_ + kNumReturns);
189 }
190
191 T reps_[kNumReturns + kNumParams];
192};
193
194// Specialization for zero-sized signatures.
195template <typename T>
196class FixedSizeSignature<T, 0, 0> : public Signature<T> {
197 public:
198 constexpr FixedSizeSignature() : Signature<T>(0, 0, nullptr) {}
199
200 // Add return types.
201 template <typename... ReturnTypes>
202 static auto Returns(ReturnTypes... return_types) {
203 return FixedSizeSignature<T, sizeof...(ReturnTypes), 0>{
204 std::initializer_list<T>{return_types...}.begin(), nullptr};
205 }
206
207 // Add parameters.
208 template <typename... ParamTypes>
209 static auto Params(ParamTypes... param_types) {
210 return FixedSizeSignature<T, 0, sizeof...(ParamTypes)>{
211 nullptr, std::initializer_list<T>{param_types...}.begin()};
212 }
213};
214
215} // namespace internal
216} // namespace v8
217
218#endif // V8_CODEGEN_SIGNATURE_H_
#define T
int16_t parameter_count
Definition builtins.cc:67
#define SBXCHECK_LT(lhs, rhs)
Definition check.h:66
Hasher & AddRange(Iterator first, Iterator last)
Definition hashing.h:127
Hasher & Add(const T &t)
Definition hashing.h:121
constexpr size_t hash() const
Definition hashing.h:111
static auto Returns(ReturnTypes... return_types)
Definition signature.h:202
static auto Params(ParamTypes... param_types)
Definition signature.h:209
FixedSizeSignature(const T *returns, const T *params)
Definition signature.h:185
T reps_[kNumReturns+kNumParams]
Definition signature.h:191
auto Returns(ReturnTypes... return_types) const
Definition signature.h:166
auto Params(ParamTypes... param_types) const
Definition signature.h:174
void AddParamAt(size_t index, T val)
Definition signature.h:58
SignatureBuilder(Zone *zone, size_t return_count, size_t parameter_count)
Definition signature.h:20
void AddReturnAt(size_t index, T val)
Definition signature.h:47
size_t return_count() const
Definition signature.h:93
bool contains(T element) const
Definition signature.h:108
bool operator==(const Signature &other) const
Definition signature.h:121
static Signature< T > * Build(Zone *zone, std::initializer_list< T > returns, std::initializer_list< T > params)
Definition signature.h:132
T GetParam(size_t index) const
Definition signature.h:96
static constexpr size_t kReturnCountOffset
Definition signature.h:140
constexpr Signature(size_t return_count, size_t parameter_count, const T *reps)
Definition signature.h:82
T GetReturn(size_t index=0) const
Definition signature.h:103
base::Vector< const T > returns() const
Definition signature.h:116
base::Vector< const T > parameters() const
Definition signature.h:113
static constexpr size_t kRepsOffset
Definition signature.h:143
static constexpr size_t kParameterCountOffset
Definition signature.h:141
bool operator!=(const Signature &other) const
Definition signature.h:127
size_t parameter_count() const
Definition signature.h:94
base::Vector< const T > all() const
Definition signature.h:117
void * Allocate(size_t size)
Definition zone.h:61
int end
size_t hash_value(AtomicMemoryOrder order)
kWasmInternalFunctionIndirectPointerTag kProtectedInstanceDataOffset sig
return value
Definition map-inl.h:893
constexpr int kSizetSize
Definition globals.h:404
#define DCHECK_NOT_NULL(val)
Definition logging.h:492
#define DCHECK(condition)
Definition logging.h:482
#define DCHECK_LT(v1, v2)
Definition logging.h:489
#define DCHECK_EQ(v1, v2)
Definition logging.h:485
constexpr bool IsAligned(T value, U alignment)
Definition macros.h:403