1 // Copyright 2015 the V8 project authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef V8_WASM_MODULE_DECODER_H_ 6 #define V8_WASM_MODULE_DECODER_H_ 7 8 #include "src/globals.h" 9 #include "src/wasm/function-body-decoder.h" 10 #include "src/wasm/wasm-module.h" 11 #include "src/wasm/wasm-result.h" 12 13 namespace v8 { 14 namespace internal { 15 namespace wasm { 16 17 const uint32_t kWasmMagic = 0x6d736100; 18 const uint32_t kWasmVersion = 0x01; 19 const uint8_t kWasmFunctionTypeForm = 0x60; 20 const uint8_t kWasmAnyFunctionTypeForm = 0x70; 21 const uint8_t kResizableMaximumFlag = 1; 22 23 enum WasmSectionCode { 24 kUnknownSectionCode = 0, // code for unknown sections 25 kTypeSectionCode = 1, // Function signature declarations 26 kImportSectionCode = 2, // Import declarations 27 kFunctionSectionCode = 3, // Function declarations 28 kTableSectionCode = 4, // Indirect function table and other tables 29 kMemorySectionCode = 5, // Memory attributes 30 kGlobalSectionCode = 6, // Global declarations 31 kExportSectionCode = 7, // Exports 32 kStartSectionCode = 8, // Start function declaration 33 kElementSectionCode = 9, // Elements section 34 kCodeSectionCode = 10, // Function code 35 kDataSectionCode = 11, // Data segments 36 kNameSectionCode = 12, // Name section (encoded as a string) 37 }; 38 39 inline bool IsValidSectionCode(uint8_t byte) { 40 return kTypeSectionCode <= byte && byte <= kDataSectionCode; 41 } 42 43 const char* SectionName(WasmSectionCode code); 44 45 typedef Result<const WasmModule*> ModuleResult; 46 typedef Result<WasmFunction*> FunctionResult; 47 typedef std::vector<std::pair<int, int>> FunctionOffsets; 48 typedef Result<FunctionOffsets> FunctionOffsetsResult; 49 struct AsmJsOffsetEntry { 50 int byte_offset; 51 int source_position_call; 52 int source_position_number_conversion; 53 }; 54 typedef std::vector<std::vector<AsmJsOffsetEntry>> AsmJsOffsets; 55 typedef Result<AsmJsOffsets> AsmJsOffsetsResult; 56 57 // Decodes the bytes of a WASM module between {module_start} and {module_end}. 58 V8_EXPORT_PRIVATE ModuleResult DecodeWasmModule(Isolate* isolate, 59 const byte* module_start, 60 const byte* module_end, 61 bool verify_functions, 62 ModuleOrigin origin); 63 64 // Exposed for testing. Decodes a single function signature, allocating it 65 // in the given zone. Returns {nullptr} upon failure. 66 V8_EXPORT_PRIVATE FunctionSig* DecodeWasmSignatureForTesting(Zone* zone, 67 const byte* start, 68 const byte* end); 69 70 // Decodes the bytes of a WASM function between 71 // {function_start} and {function_end}. 72 V8_EXPORT_PRIVATE FunctionResult DecodeWasmFunction(Isolate* isolate, 73 Zone* zone, 74 ModuleBytesEnv* env, 75 const byte* function_start, 76 const byte* function_end); 77 78 // Extracts the function offset table from the wasm module bytes. 79 // Returns a vector with <offset, length> entries, or failure if the wasm bytes 80 // are detected as invalid. Note that this validation is not complete. 81 FunctionOffsetsResult DecodeWasmFunctionOffsets(const byte* module_start, 82 const byte* module_end); 83 84 V8_EXPORT_PRIVATE WasmInitExpr DecodeWasmInitExprForTesting(const byte* start, 85 const byte* end); 86 87 struct CustomSectionOffset { 88 uint32_t section_start; 89 uint32_t name_offset; 90 uint32_t name_length; 91 uint32_t payload_offset; 92 uint32_t payload_length; 93 uint32_t section_length; 94 }; 95 96 V8_EXPORT_PRIVATE std::vector<CustomSectionOffset> DecodeCustomSections( 97 const byte* start, const byte* end); 98 99 // Extracts the mapping from wasm byte offset to asm.js source position per 100 // function. 101 // Returns a vector of vectors with <byte_offset, source_position> entries, or 102 // failure if the wasm bytes are detected as invalid. Note that this validation 103 // is not complete. 104 AsmJsOffsetsResult DecodeAsmJsOffsets(const byte* module_start, 105 const byte* module_end); 106 107 } // namespace wasm 108 } // namespace internal 109 } // namespace v8 110 111 #endif // V8_WASM_MODULE_DECODER_H_ 112