%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-disassembler-impl.h |
// Copyright 2022 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. #if !V8_ENABLE_WEBASSEMBLY #error This header should only be included if WebAssembly is enabled. #endif // !V8_ENABLE_WEBASSEMBLY #ifndef V8_WASM_WASM_DISASSEMBLER_IMPL_H_ #define V8_WASM_WASM_DISASSEMBLER_IMPL_H_ #include <iomanip> #include "src/wasm/function-body-decoder-impl.h" #include "src/wasm/names-provider.h" #include "src/wasm/string-builder-multiline.h" #include "src/wasm/wasm-opcodes.h" #include "src/zone/zone.h" namespace v8 { namespace internal { namespace wasm { template <typename ValidationTag> class ImmediatesPrinter; using IndexAsComment = NamesProvider::IndexAsComment; //////////////////////////////////////////////////////////////////////////////// // Configuration flags for aspects of behavior where we might want to change // our minds. {true} is the legacy DevTools behavior. constexpr bool kSkipFunctionTypesInTypeSection = true; constexpr IndexAsComment kIndicesAsComments = NamesProvider::kIndexAsComment; constexpr bool kSkipDataSegmentNames = true; //////////////////////////////////////////////////////////////////////////////// // Helpers. class Indentation { public: Indentation(int current, int delta) : current_(current), delta_(delta) { DCHECK_GE(current, 0); DCHECK_GE(delta, 0); } Indentation Extra(int extra) { return {current_ + extra, delta_}; } void increase() { current_ += delta_; } void decrease() { DCHECK_GE(current_, delta_); current_ -= delta_; } int current() { return current_; } private: int current_; int delta_; }; inline StringBuilder& operator<<(StringBuilder& sb, Indentation indentation) { char* ptr = sb.allocate(indentation.current()); memset(ptr, ' ', indentation.current()); return sb; } 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); class OffsetsProvider; //////////////////////////////////////////////////////////////////////////////// // FunctionBodyDisassembler. class V8_EXPORT_PRIVATE FunctionBodyDisassembler : public WasmDecoder<Decoder::FullValidationTag> { public: using ValidationTag = Decoder::FullValidationTag; enum FunctionHeader : bool { kSkipHeader = false, kPrintHeader = true }; FunctionBodyDisassembler(Zone* zone, const WasmModule* module, uint32_t func_index, WasmFeatures* detected, const FunctionSig* sig, const uint8_t* start, const uint8_t* end, uint32_t offset, const ModuleWireBytes wire_bytes, NamesProvider* names) : WasmDecoder<ValidationTag>(zone, module, WasmFeatures::All(), detected, sig, start, end, offset), func_index_(func_index), wire_bytes_(wire_bytes), names_(names) {} void DecodeAsWat(MultiLineStringBuilder& out, Indentation indentation, FunctionHeader include_header = kPrintHeader, uint32_t* first_instruction_offset = nullptr); void DecodeGlobalInitializer(StringBuilder& out); std::set<uint32_t>& used_types() { return used_types_; } protected: WasmOpcode GetOpcode(); uint32_t PrintImmediatesAndGetLength(StringBuilder& out); void PrintHexNumber(StringBuilder& out, uint64_t number); LabelInfo& label_info(int depth) { return label_stack_[label_stack_.size() - 1 - depth]; } friend class ImmediatesPrinter<ValidationTag>; uint32_t func_index_; WasmOpcode current_opcode_ = kExprUnreachable; const ModuleWireBytes wire_bytes_; NamesProvider* names_; std::set<uint32_t> used_types_; std::vector<LabelInfo> label_stack_; MultiLineStringBuilder* out_; // Labels use two different indexing systems: for looking them up in the // name section, they're indexed by order of occurrence; for generating names // like "$label0", the order in which they show up as targets of branch // instructions is used for generating consecutive names. // (This is legacy wasmparser behavior; we could change it.) uint32_t label_occurrence_index_ = 0; uint32_t label_generation_index_ = 0; }; //////////////////////////////////////////////////////////////////////////////// // ModuleDisassembler. class ModuleDisassembler { public: V8_EXPORT_PRIVATE ModuleDisassembler( MultiLineStringBuilder& out, const WasmModule* module, NamesProvider* names, const ModuleWireBytes wire_bytes, AccountingAllocator* allocator, bool collect_offsets, std::vector<int>* function_body_offsets = nullptr); V8_EXPORT_PRIVATE ~ModuleDisassembler(); V8_EXPORT_PRIVATE void PrintTypeDefinition(uint32_t type_index, Indentation indendation, IndexAsComment index_as_comment); V8_EXPORT_PRIVATE void PrintModule(Indentation indentation, size_t max_mb); private: void PrintImportName(const WasmImport& import); void PrintExportName(ImportExportKindCode kind, uint32_t index); void PrintMutableType(bool mutability, ValueType type); void PrintTable(const WasmTable& table); void PrintMemory(const WasmMemory& memory); void PrintGlobal(const WasmGlobal& global); void PrintInitExpression(const ConstantExpression& init, ValueType expected_type); void PrintTagSignature(const FunctionSig* sig); void PrintString(WireBytesRef ref); void PrintStringAsJSON(WireBytesRef ref); void LineBreakOrSpace(bool break_lines, Indentation indentation, uint32_t byte_offset); MultiLineStringBuilder& out_; const WasmModule* module_; NamesProvider* names_; const ModuleWireBytes wire_bytes_; const uint8_t* start_; Zone zone_; std::unique_ptr<OffsetsProvider> offsets_; std::vector<int>* function_body_offsets_; }; } // namespace wasm } // namespace internal } // namespace v8 #endif // V8_WASM_WASM_DISASSEMBLER_IMPL_H_