5#ifndef V8_WASM_WASM_DISASSEMBLER_IMPL_H_
6#define V8_WASM_WASM_DISASSEMBLER_IMPL_H_
11#if !V8_ENABLE_WEBASSEMBLY
12#error This header should only be included if WebAssembly is enabled.
22template <
typename Val
idationTag>
23class ImmediatesPrinter;
60 memset(ptr,
' ', indentation.
current());
69 static constexpr size_t kBufferSize = 20;
70 char buffer[kBufferSize];
71 char*
end = buffer + kBufferSize;
74 *(--out) =
'0' + (n % 10);
77 sb.
write(out,
static_cast<size_t>(
end - out));
82 return sb << index.index;
87 NamesProvider* names,
bool param_names,
151 uint32_t start_index =
static_cast<uint32_t
>(
type_offsets_.size());
178 uint32_t
offset)
override {}
180#define GETTER(name) \
181 uint32_t name##_offset(uint32_t index) { \
182 DCHECK(index < name##_offsets_.size()); \
183 return name##_offsets_[index]; \
192#define IMPORT_ADJUSTED_GETTER(name) \
193 uint32_t name##_offset(uint32_t index) { \
194 DCHECK(index >= num_imported_##name##s_ && \
195 index - num_imported_##name##s_ < name##_offsets_.size()); \
196 return name##_offsets_[index - num_imported_##name##s_]; \
201#undef IMPORT_ADJUSTED_GETTER
230 return std::make_unique<OffsetsProvider>();
243 uint32_t func_index,
bool shared,
256 FunctionHeader include_header = kPrintHeader,
257 uint32_t* first_instruction_offset =
nullptr);
271 return label_stack_[label_stack_.size() - 1 - depth];
287 uint32_t label_occurrence_index_ = 0;
288 uint32_t label_generation_index_ = 0;
300 std::unique_ptr<OffsetsProvider> offsets_provider = {},
301 std::vector<int>* function_body_offsets =
nullptr);
322 uint32_t byte_offset);
std::set< uint32_t > used_types_
std::vector< LabelInfo > label_stack_
const ModuleWireBytes wire_bytes_
std::set< uint32_t > & used_types()
FunctionBodyDisassembler(Zone *zone, const WasmModule *module, uint32_t func_index, bool shared, WasmDetectedFeatures *detected, const FunctionSig *sig, const uint8_t *start, const uint8_t *end, uint32_t offset, const ModuleWireBytes wire_bytes, NamesProvider *names)
MultiLineStringBuilder * out_
Indentation Extra(int extra)
Indentation(int current, int delta)
void LineBreakOrSpace(bool break_lines, Indentation indentation, uint32_t byte_offset)
void PrintString(WireBytesRef ref)
V8_EXPORT_PRIVATE ModuleDisassembler(MultiLineStringBuilder &out, const WasmModule *module, NamesProvider *names, const ModuleWireBytes wire_bytes, AccountingAllocator *allocator, std::unique_ptr< OffsetsProvider > offsets_provider={}, std::vector< int > *function_body_offsets=nullptr)
const WasmModule * module_
void PrintTable(const WasmTable &table)
void PrintTagSignature(const FunctionSig *sig)
void PrintExportName(ImportExportKindCode kind, uint32_t index)
V8_EXPORT_PRIVATE void PrintTypeDefinition(uint32_t type_index, Indentation indendation, IndexAsComment index_as_comment)
void PrintMemory(const WasmMemory &memory)
const ModuleWireBytes wire_bytes_
void PrintInitExpression(const ConstantExpression &init, ValueType expected_type)
V8_EXPORT_PRIVATE void PrintModule(Indentation indentation, size_t max_mb)
MultiLineStringBuilder & out_
std::vector< int > * function_body_offsets_
V8_EXPORT_PRIVATE ~ModuleDisassembler()
std::unique_ptr< OffsetsProvider > offsets_
void PrintMutableType(bool mutability, ValueType type)
void PrintImportName(const WasmImport &import)
void PrintGlobal(const WasmGlobal &global)
void PrintStringAsJSON(WireBytesRef ref)
void Description(uint32_t number) override
std::vector< uint32_t > tag_offsets_
OffsetsProvider()=default
std::vector< RecGroup > recgroups_
void DataOffset(uint32_t offset) override
void StartOffset(uint32_t offset) override
void Description(uint64_t number) override
V8_EXPORT_PRIVATE void CollectOffsets(const WasmModule *module, base::Vector< const uint8_t > wire_bytes)
void ImportsDone(const WasmModule *module) override
void GlobalOffset(uint32_t offset) override
void Description(const FunctionSig *sig) override
void Description(const char *desc, size_t length) override
void StringOffset(uint32_t offset) override
void ElementOffset(uint32_t offset) override
std::vector< uint32_t > table_offsets_
void TagOffset(uint32_t offset) override
void NextLineIfNonEmpty() override
void TableOffset(uint32_t offset) override
void NameSection(const uint8_t *start, const uint8_t *end, uint32_t offset) override
void TypeOffset(uint32_t offset) override
void MemoryOffset(uint32_t offset) override
void Bytes(const uint8_t *start, uint32_t count) override
uint32_t num_imported_tags_
void InitializerExpression(const uint8_t *start, const uint8_t *end, ValueType expected_type) override
std::vector< uint32_t > type_offsets_
std::vector< uint32_t > string_offsets_
uint32_t num_imported_tables_
std::vector< uint32_t > global_offsets_
void Description(const char *desc) override
uint32_t num_imported_globals_
void RecGroupOffset(uint32_t offset, uint32_t group_size) override
void Description(HeapType type) override
std::vector< uint32_t > element_offsets_
void Description(ValueType type) override
RecGroup recgroup(uint32_t index)
void NextLineIfFull() override
std::vector< uint32_t > data_offsets_
std::vector< uint32_t > import_offsets_
void ImportOffset(uint32_t offset) override
void FunctionBody(const WasmFunction *func, const uint8_t *start) override
void FunctionName(uint32_t func_index) override
void write(const uint8_t *data, size_t n)
char * allocate(size_t n)
const base::Vector< const uint8_t > wire_bytes_
constexpr bool kSkipFunctionTypesInTypeSection
constexpr IndexAsComment kIndicesAsComments
V8_EXPORT_PRIVATE void PrintSignatureOneLine(StringBuilder &out, const FunctionSig *sig, uint32_t func_index, NamesProvider *names, bool param_names, IndexAsComment indices_as_comments=NamesProvider::kDontPrintIndex)
std::unique_ptr< OffsetsProvider > AllocateOffsetsProvider()
constexpr bool kSkipDataSegmentNames
std::ostream & operator<<(std::ostream &os, LiftoffVarState slot)
V8_EXPORT_PRIVATE void PrintStringAsJSON(StringBuilder &out, const uint8_t *start, WireBytesRef ref)
Signature< ValueType > FunctionSig
NamesProvider::IndexAsComment IndexAsComment
kWasmInternalFunctionIndirectPointerTag kProtectedInstanceDataOffset sig
#define DCHECK_GE(v1, v2)
#define V8_EXPORT_PRIVATE
static constexpr uint32_t kInvalid
uint32_t start_type_index
static constexpr RecGroup Invalid()
#define IMPORT_ADJUSTED_GETTER(name)