5#ifndef V8_WASM_WASM_MODULE_BUILDER_H_
6#define V8_WASM_WASM_MODULE_BUILDER_H_
8#if !V8_ENABLE_WEBASSEMBLY
9#error This header should only be included if WebAssembly is enabled.
87 DCHECK_EQ(val,
static_cast<uint32_t
>(val));
95 void write(
const uint8_t* data,
size_t size) {
96 if (size == 0)
return;
98 memcpy(
pos_, data, size);
104 write(
reinterpret_cast<const uint8_t*
>(name.begin()), name.length());
118 uint32_t next = val >> 7;
119 uint8_t out =
static_cast<uint8_t
>(val & 0x7f);
121 *(ptr++) = 0x80 | out;
147 end_ = new_buffer + new_size;
174 void EmitByte(uint8_t b);
175 void EmitI32V(int32_t val);
178 void EmitU32V(uint32_t val);
181 void EmitU64V(uint64_t val);
182 void EmitCode(
const uint8_t* code, uint32_t code_size);
183 void EmitCode(std::initializer_list<const uint8_t> code);
186 void EmitGetLocal(uint32_t index);
187 void EmitSetLocal(uint32_t index);
188 void EmitTeeLocal(uint32_t index);
189 void EmitI32Const(int32_t val);
190 void EmitI64Const(int64_t val);
191 void EmitF32Const(
float val);
192 void EmitF64Const(
double val);
194 void EmitWithU8(
WasmOpcode opcode,
const uint8_t immediate);
195 void EmitWithU8U8(
WasmOpcode opcode,
const uint8_t imm1,
const uint8_t imm2);
196 void EmitWithI32V(
WasmOpcode opcode, int32_t immediate);
197 void EmitWithU32V(
WasmOpcode opcode, uint32_t immediate);
199 EmitWithU32V(opcode, index.index);
203 void EmitDirectCallIndex(uint32_t index);
204 void EmitFromInitializerExpression(
const WasmInitExpr& init_expr);
206 void AddAsmWasmOffset(
size_t call_position,
size_t to_number_position);
207 void SetAsmFunctionStartPosition(
size_t function_position);
216 void DeleteCodeAfter(
size_t position);
218 void WriteSignature(
ZoneBuffer* buffer)
const;
220 void WriteAsmWasmOffsetTable(
ZoneBuffer* buffer)
const;
251 uint32_t last_asm_byte_offset_ = 0;
252 uint32_t last_asm_source_position_ = 0;
253 uint32_t asm_func_start_source_position_ = 0;
271 kRelativeToDeclaredFunctions
289 table_index(table_index),
292 status(kStatusActive) {
304 status(declarative ? kStatusDeclarative : kStatusPassive) {
322 return kind == WasmInitExpr::kI32Const ||
323 kind == WasmInitExpr::kI64Const ||
324 kind == WasmInitExpr::kGlobalGet ||
325 kind == WasmInitExpr::kRefNullConst;
332 WasmFunctionBuilder* AddFunction(
const FunctionSig* sig =
nullptr);
333 WasmFunctionBuilder* AddFunction(ModuleTypeIndex sig_index);
334 uint32_t AddGlobal(
ValueType type,
bool mutability, WasmInitExpr init);
338 void AddDataSegment(
const uint8_t* data, uint32_t size, uint32_t dest);
339 void AddPassiveDataSegment(
const uint8_t* data, uint32_t size);
342 uint32_t AddElementSegment(WasmElemSegment segment);
345 void SetIndirectFunction(uint32_t table_index, uint32_t index_in_table,
346 uint32_t direct_function_index,
347 WasmElemSegment::FunctionIndexingMode indexing_mode);
352 uint32_t IncreaseTableMinSize(uint32_t table_index, uint32_t count);
354 ModuleTypeIndex AddSignature(
const FunctionSig* sig,
bool is_final,
355 ModuleTypeIndex supertype = kNoSuperType);
357 ModuleTypeIndex ForceAddSignature(
const FunctionSig* sig,
bool is_final,
358 ModuleTypeIndex supertype = kNoSuperType);
359 uint32_t AddTag(
const FunctionSig* type);
360 ModuleTypeIndex AddStructType(StructType* type,
bool is_final,
361 ModuleTypeIndex supertype = kNoSuperType);
362 ModuleTypeIndex AddArrayType(ArrayType* type,
bool is_final,
363 ModuleTypeIndex supertype = kNoSuperType);
364 uint32_t AddTable(ValueType type, uint32_t min_size);
365 uint32_t AddTable(ValueType type, uint32_t min_size, uint32_t max_size,
366 AddressType address_type = AddressType::kI32);
367 uint32_t AddTable(ValueType type, uint32_t min_size, uint32_t max_size,
369 AddressType address_type = AddressType::kI32);
370 uint32_t AddMemory(uint32_t min_pages);
371 uint32_t AddMemory(uint32_t min_pages, uint32_t max_pages);
372 uint32_t AddMemory64(uint32_t min_pages);
373 uint32_t AddMemory64(uint32_t min_pages, uint32_t max_pages);
374 void MarkStartFunction(WasmFunctionBuilder* builder);
385 DCHECK_EQ(current_recursive_group_start_, -1);
386 current_recursive_group_start_ =
static_cast<int>(types_.size());
391 DCHECK_NE(current_recursive_group_start_, -1);
392 recursive_groups_.emplace_back(
393 current_recursive_group_start_,
394 static_cast<uint32_t
>(types_.size()) - current_recursive_group_start_);
395 current_recursive_group_start_ = -1;
399 recursive_groups_.emplace_back(
start, size);
404 void WriteAsmJsOffsetTable(
ZoneBuffer* buffer)
const;
411 return types_[
index].kind == TypeDefinition::kFunction;
416 DCHECK(types_[index].
kind == TypeDefinition::kFunction);
417 return types_[
index].function_sig;
420 return GetSignature(index.index);
424 return types_[
index].kind == TypeDefinition::kStruct;
428 return types_[
index].struct_type;
431 return GetStructType(index.index);
435 return types_[
index].kind == TypeDefinition::kArray;
439 return types_[
index].array_type;
442 return GetArrayType(index.index);
446 return types_[
index].supertype;
450 int NumTags() {
return static_cast<int>(tags_.size()); }
452 int NumTypes() {
return static_cast<int>(types_.size()); }
454 int NumTables() {
return static_cast<int>(tables_.size()); }
461 return static_cast<int>(function_imports_.size());
472 return types_[tags_[
index].index].function_sig;
511 uint32_t max_size = 0;
512 bool has_maximum =
false;
515 std::optional<WasmInitExpr> init = {};
517 bool is_table64()
const {
return address_type == AddressType::kI64; }
522 uint32_t max_pages = 0;
523 bool has_max_pages =
false;
527 bool is_memory64()
const {
return address_type == AddressType::kI64; }
533 bool is_active =
true;
559 bool adding_imports_allowed_ =
true;
T * AllocateArray(size_t length)
static void write_i32v(uint8_t **dest, int32_t val)
static void write_u32v(uint8_t **dest, uint32_t val)
static void write_u64v(uint8_t **dest, uint64_t val)
static void write_i64v(uint8_t **dest, int64_t val)
void EmitI32V(ModuleTypeIndex index)
ZoneVector< uint32_t > i64_temps_
WasmModuleBuilder * builder() const
ModuleTypeIndex sig_index() const
ModuleTypeIndex signature_index_
ZoneVector< uint32_t > f64_temps_
const FunctionSig * signature() const
ZoneVector< uint32_t > i32_temps_
WasmModuleBuilder * builder_
uint32_t func_index() const
size_t GetPosition() const
void EmitWithU32V(WasmOpcode opcode, ModuleTypeIndex index)
void EmitS128Const(Simd128 val)
void EmitU32V(ModuleTypeIndex index)
void FixupByte(size_t position, uint8_t value)
ZoneVector< uint32_t > f32_temps_
base::Vector< const char > name_
ZoneVector< DirectCallIndex > direct_calls_
MOVE_ONLY_NO_DEFAULT_CONSTRUCTOR(WasmElemSegment)
WasmElemSegment(Zone *zone, ValueType type, uint32_t table_index, WasmInitExpr offset)
bool IsValidOffsetKind(WasmInitExpr::Operator kind)
ZoneVector< Entry > entries
WasmElemSegment(Zone *zone, ValueType type, bool declarative, WasmInitExpr offset)
const FunctionSig * GetSignature(uint32_t index)
const ArrayType * GetArrayType(ModuleTypeIndex index)
const ArrayType * GetArrayType(uint32_t index)
ZoneUnorderedMap< FunctionSig, ModuleTypeIndex > signature_map_
bool IsMutableGlobal(uint32_t index) const
ZoneVector< ModuleTypeIndex > tags_
WasmModuleBuilder(const WasmModuleBuilder &)=delete
const FunctionSig * GetSignature(ModuleTypeIndex index)
const StructType * GetStructType(uint32_t index)
bool IsArrayType(ModuleTypeIndex index)
bool IsArrayType(uint32_t index)
const StructType * GetStructType(ModuleTypeIndex index)
int NumImportedFunctions()
const FunctionSig * GetTagType(int index)
int start_function_index_
ZoneVector< WasmTable > tables_
int NumDeclaredFunctions()
void StartRecursiveTypeGroup()
int current_recursive_group_start_
bool IsStructType(uint32_t index)
ZoneVector< WasmGlobalImport > global_imports_
ValueType GetTableType(uint32_t index)
bool IsStructType(ModuleTypeIndex index)
ValueType GetGlobalType(uint32_t index) const
WasmModuleBuilder & operator=(const WasmModuleBuilder &)=delete
ZoneVector< WasmExport > exports_
ZoneVector< RecGroup > recursive_groups_
bool IsSignature(ModuleTypeIndex index)
void AddExport(base::Vector< const char > name, WasmFunctionBuilder *builder)
ZoneVector< WasmMemory > memories_
ZoneVector< WasmElemSegment > element_segments_
void AddRecursiveTypeGroup(uint32_t start, uint32_t size)
ZoneVector< WasmDataSegment > data_segments_
ZoneVector< TypeDefinition > types_
ModuleTypeIndex GetSuperType(uint32_t index)
bool IsSignature(uint32_t index)
ZoneVector< WasmFunctionImport > function_imports_
ZoneVector< WasmFunctionBuilder * > functions_
ZoneVector< WasmGlobal > globals_
WasmFunctionBuilder * GetFunction(uint32_t index)
bool IsMemory64(uint32_t index)
void EndRecursiveTypeGroup()
bool IsTable64(uint32_t index)
void write_u32v(ModuleTypeIndex index)
void write_u64v(uint64_t val)
void write_i32v(int32_t val)
void patch_u32v(size_t offset, uint32_t val)
void write_f64(double val)
void write_u16(uint16_t x)
void write_u32(uint32_t x)
void write_u64(uint64_t x)
void write_u32v(uint32_t val)
void write_size(size_t val)
void patch_u8(size_t offset, uint8_t val)
void EnsureSpace(size_t size)
ZoneBuffer(Zone *zone, size_t initial=kInitialSize)
void write_string(base::Vector< const char > name)
void Truncate(size_t size)
void write_f32(float val)
static constexpr size_t kInitialSize
void write_i64v(int64_t val)
void write(const uint8_t *data, size_t size)
ZoneVector< Entry > entries
static void WriteLittleEndianValue(Address p, V value)
V8_INLINE Dest bit_cast(Source const &source)
constexpr uint8_t kNoCompilationHint
constexpr size_t kPaddedVarInt32Size
constexpr size_t kMaxVarInt64Size
WasmCompilationHintStrategy
constexpr size_t kMaxVarInt32Size
kWasmInternalFunctionIndirectPointerTag kProtectedInstanceDataOffset sig
JSArrayBuffer::IsDetachableBit is_shared
const std::vector< ModuleTypeIndex > & functions_
std::vector< ValueType > globals_
#define DCHECK_NE(v1, v2)
#define DCHECK_GE(v1, v2)
#define DCHECK(condition)
#define DCHECK_EQ(v1, v2)
#define V8_EXPORT_PRIVATE
ZoneVector< uint8_t > data
Entry(Kind kind, uint32_t index)
base::Vector< const char > name
ImportExportKindCode kind
ModuleTypeIndex sig_index
base::Vector< const char > module
base::Vector< const char > name
base::Vector< const char > name
base::Vector< const char > module
const wasm::FunctionBody & body_