5#ifndef V8_CODEGEN_SIGNATURE_H_
6#define V8_CODEGEN_SIGNATURE_H_
17template <
typename SigT,
typename T>
27 constexpr size_t padding =
sizeof(SigT) %
alignof(
T);
29 const size_t allocated_bytes =
31 void* memory = zone->
Allocate<AllocationTypeTag>(allocated_bytes);
33 reinterpret_cast<uint8_t*
>(memory) +
sizeof(SigT) + padding;
35 buffer_ =
reinterpret_cast<T*
>(rep_buffer);
90 static_assert(std::is_standard_layout<Signature<T>>
::value);
109 return std::find(
all().cbegin(),
all().cend(), element) !=
all().cend();
122 if (
this == &other)
return true;
124 if (
return_count() != other.return_count())
return false;
125 return std::equal(
all().begin(),
all().
end(), other.all().begin());
133 std::initializer_list<T> params) {
136 for (T param : params) builder.
AddParam(param);
137 return builder.
Get();
161template <
typename T,
size_t kNumReturns = 0,
size_t kNumParams = 0>
165 template <
typename... ReturnTypes>
166 auto Returns(ReturnTypes... return_types)
const {
167 static_assert(kNumReturns == 0,
"Please specify all return types at once");
169 std::initializer_list<T>{return_types...}.begin(),
reps_};
173 template <
typename... ParamTypes>
174 auto Params(ParamTypes... param_types)
const {
175 static_assert(kNumParams == 0,
"Please specify all parameters at once");
177 reps_, std::initializer_list<T>{param_types...}.begin()};
182 template <
typename T2,
size_t kNumReturns2,
size_t kNumParams2>
188 std::copy(params, params + kNumParams,
reps_ + kNumReturns);
201 template <
typename... ReturnTypes>
202 static auto Returns(ReturnTypes... return_types) {
204 std::initializer_list<T>{return_types...}.begin(),
nullptr};
208 template <
typename... ParamTypes>
209 static auto Params(ParamTypes... param_types) {
211 nullptr, std::initializer_list<T>{param_types...}.begin()};
#define SBXCHECK_LT(lhs, rhs)
Hasher & AddRange(Iterator first, Iterator last)
constexpr size_t hash() const
static auto Returns(ReturnTypes... return_types)
constexpr FixedSizeSignature()
static auto Params(ParamTypes... param_types)
FixedSizeSignature(const T *returns, const T *params)
T reps_[kNumReturns+kNumParams]
auto Returns(ReturnTypes... return_types) const
auto Params(ParamTypes... param_types) const
const size_t parameter_count_
void AddParamAt(size_t index, T val)
const size_t return_count_
SignatureBuilder(Zone *zone, size_t return_count, size_t parameter_count)
void AddReturnAt(size_t index, T val)
size_t return_count() const
bool contains(T element) const
bool operator==(const Signature &other) const
static Signature< T > * Build(Zone *zone, std::initializer_list< T > returns, std::initializer_list< T > params)
T GetParam(size_t index) const
static constexpr size_t kReturnCountOffset
constexpr Signature(size_t return_count, size_t parameter_count, const T *reps)
T GetReturn(size_t index=0) const
base::Vector< const T > returns() const
base::Vector< const T > parameters() const
static constexpr size_t kRepsOffset
static constexpr size_t kParameterCountOffset
bool operator!=(const Signature &other) const
size_t parameter_count() const
base::Vector< const T > all() const
void * Allocate(size_t size)
size_t hash_value(AtomicMemoryOrder order)
kWasmInternalFunctionIndirectPointerTag kProtectedInstanceDataOffset sig
#define DCHECK_NOT_NULL(val)
#define DCHECK(condition)
#define DCHECK_LT(v1, v2)
#define DCHECK_EQ(v1, v2)
constexpr bool IsAligned(T value, U alignment)