/* * Copyright 2016 WebAssembly Community Group participants * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef WABT_BINARY_READER_H_ #define WABT_BINARY_READER_H_ #include #include #include "binary.h" #include "common.h" #include "opcode.h" #define WABT_READ_BINARY_OPTIONS_DEFAULT \ { nullptr, false } namespace wabt { class Stream; struct ReadBinaryOptions { Stream* log_stream; bool read_debug_names; }; class BinaryReader { public: struct State { const uint8_t* data; size_t size; size_t offset; }; virtual ~BinaryReader() {} virtual bool OnError(const char* message) = 0; virtual void OnSetState(const State* s) { state = s; } /* Module */ virtual Result BeginModule(uint32_t version) = 0; virtual Result EndModule() = 0; virtual Result BeginSection(BinarySection section_type, uint32_t size) = 0; /* Custom section */ virtual Result BeginCustomSection(uint32_t size, StringSlice section_name) = 0; virtual Result EndCustomSection() = 0; /* Type section */ virtual Result BeginTypeSection(uint32_t size) = 0; virtual Result OnTypeCount(uint32_t count) = 0; virtual Result OnType(uint32_t index, uint32_t param_count, Type* param_types, uint32_t result_count, Type* result_types) = 0; virtual Result EndTypeSection() = 0; /* Import section */ virtual Result BeginImportSection(uint32_t size) = 0; virtual Result OnImportCount(uint32_t count) = 0; virtual Result OnImport(uint32_t index, StringSlice module_name, StringSlice field_name) = 0; virtual Result OnImportFunc(uint32_t import_index, StringSlice module_name, StringSlice field_name, uint32_t func_index, uint32_t sig_index) = 0; virtual Result OnImportTable(uint32_t import_index, StringSlice module_name, StringSlice field_name, uint32_t table_index, Type elem_type, const Limits* elem_limits) = 0; virtual Result OnImportMemory(uint32_t import_index, StringSlice module_name, StringSlice field_name, uint32_t memory_index, const Limits* page_limits) = 0; virtual Result OnImportGlobal(uint32_t import_index, StringSlice module_name, StringSlice field_name, uint32_t global_index, Type type, bool mutable_) = 0; virtual Result EndImportSection() = 0; /* Function section */ virtual Result BeginFunctionSection(uint32_t size) = 0; virtual Result OnFunctionCount(uint32_t count) = 0; virtual Result OnFunction(uint32_t index, uint32_t sig_index) = 0; virtual Result EndFunctionSection() = 0; /* Table section */ virtual Result BeginTableSection(uint32_t size) = 0; virtual Result OnTableCount(uint32_t count) = 0; virtual Result OnTable(uint32_t index, Type elem_type, const Limits* elem_limits) = 0; virtual Result EndTableSection() = 0; /* Memory section */ virtual Result BeginMemorySection(uint32_t size) = 0; virtual Result OnMemoryCount(uint32_t count) = 0; virtual Result OnMemory(uint32_t index, const Limits* limits) = 0; virtual Result EndMemorySection() = 0; /* Global section */ virtual Result BeginGlobalSection(uint32_t size) = 0; virtual Result OnGlobalCount(uint32_t count) = 0; virtual Result BeginGlobal(uint32_t index, Type type, bool mutable_) = 0; virtual Result BeginGlobalInitExpr(uint32_t index) = 0; virtual Result EndGlobalInitExpr(uint32_t index) = 0; virtual Result EndGlobal(uint32_t index) = 0; virtual Result EndGlobalSection() = 0; /* Exports section */ virtual Result BeginExportSection(uint32_t size) = 0; virtual Result OnExportCount(uint32_t count) = 0; virtual Result OnExport(uint32_t index, ExternalKind kind, uint32_t item_index, StringSlice name) = 0; virtual Result EndExportSection() = 0; /* Start section */ virtual Result BeginStartSection(uint32_t size) = 0; virtual Result OnStartFunction(uint32_t func_index) = 0; virtual Result EndStartSection() = 0; /* Code section */ virtual Result BeginCodeSection(uint32_t size) = 0; virtual Result OnFunctionBodyCount(uint32_t count) = 0; virtual Result BeginFunctionBody(uint32_t index) = 0; virtual Result OnLocalDeclCount(uint32_t count) = 0; virtual Result OnLocalDecl(uint32_t decl_index, uint32_t count, Type type) = 0; /* Function expressions; called between BeginFunctionBody and EndFunctionBody */ virtual Result OnOpcode(Opcode Opcode) = 0; virtual Result OnOpcodeBare() = 0; virtual Result OnOpcodeUint32(uint32_t value) = 0; virtual Result OnOpcodeUint32Uint32(uint32_t value, uint32_t value2) = 0; virtual Result OnOpcodeUint64(uint64_t value) = 0; virtual Result OnOpcodeF32(uint32_t value) = 0; virtual Result OnOpcodeF64(uint64_t value) = 0; virtual Result OnOpcodeBlockSig(uint32_t num_types, Type* sig_types) = 0; virtual Result OnBinaryExpr(Opcode opcode) = 0; virtual Result OnBlockExpr(uint32_t num_types, Type* sig_types) = 0; virtual Result OnBrExpr(uint32_t depth) = 0; virtual Result OnBrIfExpr(uint32_t depth) = 0; virtual Result OnBrTableExpr(uint32_t num_targets, uint32_t* target_depths, uint32_t default_target_depth) = 0; virtual Result OnCallExpr(uint32_t func_index) = 0; virtual Result OnCallIndirectExpr(uint32_t sig_index) = 0; virtual Result OnCompareExpr(Opcode opcode) = 0; virtual Result OnConvertExpr(Opcode opcode) = 0; virtual Result OnCurrentMemoryExpr() = 0; virtual Result OnDropExpr() = 0; virtual Result OnElseExpr() = 0; virtual Result OnEndExpr() = 0; virtual Result OnEndFunc() = 0; virtual Result OnF32ConstExpr(uint32_t value_bits) = 0; virtual Result OnF64ConstExpr(uint64_t value_bits) = 0; virtual Result OnGetGlobalExpr(uint32_t global_index) = 0; virtual Result OnGetLocalExpr(uint32_t local_index) = 0; virtual Result OnGrowMemoryExpr() = 0; virtual Result OnI32ConstExpr(uint32_t value) = 0; virtual Result OnI64ConstExpr(uint64_t value) = 0; virtual Result OnIfExpr(uint32_t num_types, Type* sig_types) = 0; virtual Result OnLoadExpr(Opcode opcode, uint32_t alignment_log2, uint32_t offset) = 0; virtual Result OnLoopExpr(uint32_t num_types, Type* sig_types) = 0; virtual Result OnNopExpr() = 0; virtual Result OnReturnExpr() = 0; virtual Result OnSelectExpr() = 0; virtual Result OnSetGlobalExpr(uint32_t global_index) = 0; virtual Result OnSetLocalExpr(uint32_t local_index) = 0; virtual Result OnStoreExpr(Opcode opcode, uint32_t alignment_log2, uint32_t offset) = 0; virtual Result OnTeeLocalExpr(uint32_t local_index) = 0; virtual Result OnUnaryExpr(Opcode opcode) = 0; virtual Result OnUnreachableExpr() = 0; virtual Result EndFunctionBody(uint32_t index) = 0; virtual Result EndCodeSection() = 0; /* Elem section */ virtual Result BeginElemSection(uint32_t size) = 0; virtual Result OnElemSegmentCount(uint32_t count) = 0; virtual Result BeginElemSegment(uint32_t index, uint32_t table_index) = 0; virtual Result BeginElemSegmentInitExpr(uint32_t index) = 0; virtual Result EndElemSegmentInitExpr(uint32_t index) = 0; virtual Result OnElemSegmentFunctionIndexCount(uint32_t index, uint32_t count) = 0; virtual Result OnElemSegmentFunctionIndex(uint32_t index, uint32_t func_index) = 0; virtual Result EndElemSegment(uint32_t index) = 0; virtual Result EndElemSection() = 0; /* Data section */ virtual Result BeginDataSection(uint32_t size) = 0; virtual Result OnDataSegmentCount(uint32_t count) = 0; virtual Result BeginDataSegment(uint32_t index, uint32_t memory_index) = 0; virtual Result BeginDataSegmentInitExpr(uint32_t index) = 0; virtual Result EndDataSegmentInitExpr(uint32_t index) = 0; virtual Result OnDataSegmentData(uint32_t index, const void* data, uint32_t size) = 0; virtual Result EndDataSegment(uint32_t index) = 0; virtual Result EndDataSection() = 0; /* Names section */ virtual Result BeginNamesSection(uint32_t size) = 0; virtual Result OnFunctionNameSubsection(uint32_t index, uint32_t name_type, uint32_t subsection_size) = 0; virtual Result OnFunctionNamesCount(uint32_t num_functions) = 0; virtual Result OnFunctionName(uint32_t function_index, StringSlice function_name) = 0; virtual Result OnLocalNameSubsection(uint32_t index, uint32_t name_type, uint32_t subsection_size) = 0; virtual Result OnLocalNameFunctionCount(uint32_t num_functions) = 0; virtual Result OnLocalNameLocalCount(uint32_t function_index, uint32_t num_locals) = 0; virtual Result OnLocalName(uint32_t function_index, uint32_t local_index, StringSlice local_name) = 0; virtual Result EndNamesSection() = 0; /* Reloc section */ virtual Result BeginRelocSection(uint32_t size) = 0; virtual Result OnRelocCount(uint32_t count, BinarySection section_code, StringSlice section_name) = 0; virtual Result OnReloc(RelocType type, uint32_t offset, uint32_t index, uint32_t addend) = 0; virtual Result EndRelocSection() = 0; /* InitExpr - used by elem, data and global sections; these functions are * only called between calls to Begin*InitExpr and End*InitExpr */ virtual Result OnInitExprF32ConstExpr(uint32_t index, uint32_t value) = 0; virtual Result OnInitExprF64ConstExpr(uint32_t index, uint64_t value) = 0; virtual Result OnInitExprGetGlobalExpr(uint32_t index, uint32_t global_index) = 0; virtual Result OnInitExprI32ConstExpr(uint32_t index, uint32_t value) = 0; virtual Result OnInitExprI64ConstExpr(uint32_t index, uint64_t value) = 0; const State* state = nullptr; }; Result read_binary(const void* data, size_t size, BinaryReader* reader, const ReadBinaryOptions* options); size_t read_u32_leb128(const uint8_t* ptr, const uint8_t* end, uint32_t* out_value); size_t read_i32_leb128(const uint8_t* ptr, const uint8_t* end, uint32_t* out_value); } // namespace wabt #endif /* WABT_BINARY_READER_H_ */