%PDF- %PDF-
| Direktori : /home/vacivi36/vittasync.vacivitta.com.br/vittasync/node/deps/v8/src/wasm/ |
| Current File : /home/vacivi36/vittasync.vacivitta.com.br/vittasync/node/deps/v8/src/wasm/wasm-builtin-list.h |
// Copyright 2023 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_WASM_WASM_BUILTIN_LIST_H_
#define V8_WASM_WASM_BUILTIN_LIST_H_
#include "src/base/macros.h"
#include "src/builtins/builtins.h"
#include "src/common/globals.h"
#if !V8_ENABLE_WEBASSEMBLY
#error This header should only be included if WebAssembly is enabled.
#endif // !V8_ENABLE_WEBASSEMBLY
namespace v8::internal::wasm {
// Convenience macro listing all builtins called from wasm. Note that the first
// few elements of the list coincide with {compiler::TrapId}, order matters.
#define WASM_BUILTIN_LIST(V, VTRAP) \
FOREACH_WASM_TRAPREASON(VTRAP) \
V(WasmCompileLazy) \
V(WasmTriggerTierUp) \
V(WasmLiftoffFrameSetup) \
V(WasmDebugBreak) \
V(WasmInt32ToHeapNumber) \
V(WasmTaggedNonSmiToInt32) \
V(WasmFloat32ToNumber) \
V(WasmFloat64ToNumber) \
V(WasmTaggedToFloat64) \
V(WasmAllocateJSArray) \
V(WasmAtomicNotify) \
V(WasmI32AtomicWait) \
V(WasmI64AtomicWait) \
V(WasmGetOwnProperty) \
V(WasmRefFunc) \
V(WasmInternalFunctionCreateExternal) \
V(WasmMemoryGrow) \
V(WasmTableInit) \
V(WasmTableCopy) \
V(WasmTableFill) \
V(WasmTableGrow) \
V(WasmTableGet) \
V(WasmTableSet) \
V(WasmTableGetFuncRef) \
V(WasmTableSetFuncRef) \
V(WasmStackGuard) \
V(WasmStackOverflow) \
V(WasmAllocateFixedArray) \
V(WasmThrow) \
V(WasmRethrow) \
V(WasmRethrowExplicitContext) \
V(WasmTraceEnter) \
V(WasmTraceExit) \
V(WasmTraceMemory) \
V(BigIntToI32Pair) \
V(BigIntToI64) \
V(CallRefIC) \
V(DoubleToI) \
V(I32PairToBigInt) \
V(I64ToBigInt) \
V(RecordWriteSaveFP) \
V(RecordWriteIgnoreFP) \
V(ToNumber) \
V(ThrowDataViewGetInt32DetachedError) \
V(ThrowDataViewGetInt32OutOfBounds) \
V(ThrowDataViewGetInt32TypeError) \
IF_TSAN(V, TSANRelaxedStore8IgnoreFP) \
IF_TSAN(V, TSANRelaxedStore8SaveFP) \
IF_TSAN(V, TSANRelaxedStore16IgnoreFP) \
IF_TSAN(V, TSANRelaxedStore16SaveFP) \
IF_TSAN(V, TSANRelaxedStore32IgnoreFP) \
IF_TSAN(V, TSANRelaxedStore32SaveFP) \
IF_TSAN(V, TSANRelaxedStore64IgnoreFP) \
IF_TSAN(V, TSANRelaxedStore64SaveFP) \
IF_TSAN(V, TSANSeqCstStore8IgnoreFP) \
IF_TSAN(V, TSANSeqCstStore8SaveFP) \
IF_TSAN(V, TSANSeqCstStore16IgnoreFP) \
IF_TSAN(V, TSANSeqCstStore16SaveFP) \
IF_TSAN(V, TSANSeqCstStore32IgnoreFP) \
IF_TSAN(V, TSANSeqCstStore32SaveFP) \
IF_TSAN(V, TSANSeqCstStore64IgnoreFP) \
IF_TSAN(V, TSANSeqCstStore64SaveFP) \
IF_TSAN(V, TSANRelaxedLoad32IgnoreFP) \
IF_TSAN(V, TSANRelaxedLoad32SaveFP) \
IF_TSAN(V, TSANRelaxedLoad64IgnoreFP) \
IF_TSAN(V, TSANRelaxedLoad64SaveFP) \
V(WasmAllocateArray_Uninitialized) \
V(WasmArrayCopy) \
V(WasmArrayCopyWithChecks) \
V(WasmArrayNewSegment) \
V(WasmArrayInitSegment) \
V(WasmAllocateStructWithRtt) \
V(WasmOnStackReplace) \
V(WasmSuspend) \
V(WasmStringNewWtf8) \
V(WasmStringNewWtf16) \
V(WasmStringConst) \
V(WasmStringMeasureUtf8) \
V(WasmStringMeasureWtf8) \
V(WasmStringEncodeWtf8) \
V(WasmStringEncodeWtf16) \
V(WasmStringConcat) \
V(WasmStringEqual) \
V(WasmStringIsUSVSequence) \
V(WasmStringAsWtf16) \
V(WasmStringViewWtf16GetCodeUnit) \
V(WasmStringCodePointAt) \
V(WasmStringViewWtf16Encode) \
V(WasmStringViewWtf16Slice) \
V(WasmStringNewWtf8Array) \
V(WasmStringNewWtf16Array) \
V(WasmStringEncodeWtf8Array) \
V(WasmStringEncodeWtf16Array) \
V(WasmStringAsWtf8) \
V(WasmStringViewWtf8Advance) \
V(WasmStringViewWtf8Encode) \
V(WasmStringViewWtf8Slice) \
V(WasmStringAsIter) \
V(WasmStringViewIterNext) \
V(WasmStringViewIterAdvance) \
V(WasmStringViewIterRewind) \
V(WasmStringViewIterSlice) \
V(StringCompare) \
V(WasmStringFromCodePoint) \
V(WasmStringHash) \
V(WasmExternInternalize) \
V(WasmStringFromDataSegment) \
V(StringAdd_CheckNone) \
V(DebugPrintFloat64) \
V(DebugPrintWordPtr)
namespace detail {
constexpr std::array<uint8_t, static_cast<int>(Builtin::kFirstBytecodeHandler)>
InitBuiltinToFarJumpTableIndex() {
std::array<uint8_t, static_cast<int>(Builtin::kFirstBytecodeHandler)>
result{};
uint8_t next_index = 0;
#define DEF_INIT_LOOKUP(NAME) \
result[static_cast<int>(Builtin::k##NAME)] = next_index++;
#define DEF_INIT_LOOKUP_TRAP(NAME) DEF_INIT_LOOKUP(ThrowWasm##NAME)
WASM_BUILTIN_LIST(DEF_INIT_LOOKUP, DEF_INIT_LOOKUP_TRAP)
#undef DEF_INIT_LOOKUP_TRAP
#undef DEF_INIT_LOOKUP
return result;
}
} // namespace detail
class BuiltinLookup {
public:
static constexpr int JumptableIndexForBuiltin(Builtin builtin) {
int result = kBuiltinToFarJumpTableIndex[static_cast<int>(builtin)];
DCHECK_EQ(builtin, kFarJumpTableIndexToBuiltin[result]);
return result;
}
static constexpr Builtin BuiltinForJumptableIndex(int index) {
Builtin result = kFarJumpTableIndexToBuiltin[index];
DCHECK_EQ(index, kBuiltinToFarJumpTableIndex[static_cast<int>(result)]);
return result;
}
static constexpr int BuiltinCount() { return kBuiltinCount; }
private:
#define BUILTIN_COUNTER(NAME) +1
static constexpr int kBuiltinCount =
0 WASM_BUILTIN_LIST(BUILTIN_COUNTER, BUILTIN_COUNTER);
#undef BUILTIN_COUNTER
static constexpr auto kFarJumpTableIndexToBuiltin =
base::make_array<static_cast<int>(kBuiltinCount)>([](size_t index) {
size_t next_index = 0;
#define DEF_INIT_LOOKUP(NAME) \
if (index == next_index) { \
return Builtin::k##NAME; \
} \
++next_index;
#define DEF_INIT_LOOKUP_TRAP(NAME) DEF_INIT_LOOKUP(ThrowWasm##NAME)
WASM_BUILTIN_LIST(DEF_INIT_LOOKUP, DEF_INIT_LOOKUP_TRAP)
#undef DEF_INIT_LOOKUP_TRAP
#undef DEF_INIT_LOOKUP
return Builtin::kNoBuiltinId;
});
static constexpr auto kBuiltinToFarJumpTableIndex =
detail::InitBuiltinToFarJumpTableIndex();
};
} // namespace v8::internal::wasm
#undef WASM_BUILTIN_LIST
#endif // V8_WASM_WASM_BUILTIN_LIST_H_