OLD | NEW |
1 // Copyright 2015 the V8 project authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "src/wasm/module-decoder.h" | 5 #include "src/wasm/module-decoder.h" |
6 | 6 |
7 #include "src/base/functional.h" | 7 #include "src/base/functional.h" |
8 #include "src/base/platform/platform.h" | 8 #include "src/base/platform/platform.h" |
9 #include "src/flags.h" | 9 #include "src/flags.h" |
10 #include "src/macro-assembler.h" | 10 #include "src/macro-assembler.h" |
(...skipping 1145 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1156 if (function_start > function_end) return FunctionError("start > end"); | 1156 if (function_start > function_end) return FunctionError("start > end"); |
1157 if (size > kMaxFunctionSize) | 1157 if (size > kMaxFunctionSize) |
1158 return FunctionError("size > maximum function size"); | 1158 return FunctionError("size > maximum function size"); |
1159 isolate->counters()->wasm_function_size_bytes()->AddSample( | 1159 isolate->counters()->wasm_function_size_bytes()->AddSample( |
1160 static_cast<int>(size)); | 1160 static_cast<int>(size)); |
1161 WasmFunction* function = new WasmFunction(); | 1161 WasmFunction* function = new WasmFunction(); |
1162 ModuleDecoder decoder(zone, function_start, function_end, kWasmOrigin); | 1162 ModuleDecoder decoder(zone, function_start, function_end, kWasmOrigin); |
1163 return decoder.DecodeSingleFunction(module_env, function); | 1163 return decoder.DecodeSingleFunction(module_env, function); |
1164 } | 1164 } |
1165 | 1165 |
1166 FunctionOffsetsResult DecodeWasmFunctionOffsets( | 1166 FunctionOffsetsResult DecodeWasmFunctionOffsets(const byte* module_start, |
1167 const byte* module_start, const byte* module_end, | 1167 const byte* module_end) { |
1168 uint32_t num_imported_functions) { | |
1169 // Find and decode the code section. | 1168 // Find and decode the code section. |
1170 Vector<const byte> code_section = | 1169 Vector<const byte> code_section = |
1171 FindSection(module_start, module_end, kCodeSectionCode); | 1170 FindSection(module_start, module_end, kCodeSectionCode); |
1172 Decoder decoder(code_section.start(), code_section.end()); | 1171 Decoder decoder(code_section.start(), code_section.end()); |
1173 FunctionOffsets table; | 1172 FunctionOffsets table; |
1174 if (!code_section.start()) { | 1173 if (!code_section.start()) { |
1175 decoder.error("no code section"); | 1174 decoder.error("no code section"); |
1176 return decoder.toResult(std::move(table)); | 1175 return decoder.toResult(std::move(table)); |
1177 } | 1176 } |
1178 | 1177 |
1179 uint32_t functions_count = decoder.consume_u32v("functions count"); | 1178 uint32_t functions_count = decoder.consume_u32v("functions count"); |
1180 // Reserve space for the entries, taking care of invalid input. | 1179 // Reserve space for the entries, taking care of invalid input. |
1181 if (functions_count < static_cast<unsigned>(code_section.length()) / 2) { | 1180 if (functions_count < static_cast<unsigned>(code_section.length()) / 2) { |
1182 table.reserve(num_imported_functions + functions_count); | 1181 table.reserve(functions_count); |
1183 } | 1182 } |
1184 | 1183 |
1185 // Add null entries for the imported functions. | |
1186 table.resize(num_imported_functions); | |
1187 | |
1188 int section_offset = static_cast<int>(code_section.start() - module_start); | 1184 int section_offset = static_cast<int>(code_section.start() - module_start); |
1189 DCHECK_LE(0, section_offset); | 1185 DCHECK_LE(0, section_offset); |
1190 for (uint32_t i = 0; i < functions_count && decoder.ok(); ++i) { | 1186 for (uint32_t i = 0; i < functions_count && decoder.ok(); ++i) { |
1191 uint32_t size = decoder.consume_u32v("body size"); | 1187 uint32_t size = decoder.consume_u32v("body size"); |
1192 int offset = static_cast<int>(section_offset + decoder.pc_offset()); | 1188 int offset = static_cast<int>(section_offset + decoder.pc_offset()); |
1193 table.push_back(std::make_pair(offset, static_cast<int>(size))); | 1189 table.push_back(std::make_pair(offset, static_cast<int>(size))); |
1194 DCHECK(table.back().first >= 0 && table.back().second >= 0); | 1190 DCHECK(table.back().first >= 0 && table.back().second >= 0); |
1195 decoder.consume_bytes(size); | 1191 decoder.consume_bytes(size); |
1196 } | 1192 } |
1197 if (decoder.more()) decoder.error("unexpected additional bytes"); | 1193 if (decoder.more()) decoder.error("unexpected additional bytes"); |
1198 | 1194 |
1199 return decoder.toResult(std::move(table)); | 1195 return decoder.toResult(std::move(table)); |
1200 } | 1196 } |
1201 | 1197 |
1202 AsmJsOffsetsResult DecodeAsmJsOffsets(const byte* tables_start, | 1198 AsmJsOffsetsResult DecodeAsmJsOffsets(const byte* tables_start, |
1203 const byte* tables_end, | 1199 const byte* tables_end) { |
1204 uint32_t num_imported_functions) { | |
1205 AsmJsOffsets table; | 1200 AsmJsOffsets table; |
1206 | 1201 |
1207 Decoder decoder(tables_start, tables_end); | 1202 Decoder decoder(tables_start, tables_end); |
1208 uint32_t functions_count = decoder.consume_u32v("functions count"); | 1203 uint32_t functions_count = decoder.consume_u32v("functions count"); |
1209 // Reserve space for the entries, taking care of invalid input. | 1204 // Reserve space for the entries, taking care of invalid input. |
1210 if (functions_count < static_cast<unsigned>(tables_end - tables_start)) { | 1205 if (functions_count < static_cast<unsigned>(tables_end - tables_start)) { |
1211 table.reserve(num_imported_functions + functions_count); | 1206 table.reserve(functions_count); |
1212 } | 1207 } |
1213 | 1208 |
1214 // Add null entries for the imported functions. | |
1215 table.resize(num_imported_functions); | |
1216 | |
1217 for (uint32_t i = 0; i < functions_count && decoder.ok(); ++i) { | 1209 for (uint32_t i = 0; i < functions_count && decoder.ok(); ++i) { |
1218 uint32_t size = decoder.consume_u32v("table size"); | 1210 uint32_t size = decoder.consume_u32v("table size"); |
1219 if (size == 0) { | 1211 if (size == 0) { |
1220 table.push_back(std::vector<std::pair<int, int>>()); | 1212 table.push_back(std::vector<std::pair<int, int>>()); |
1221 continue; | 1213 continue; |
1222 } | 1214 } |
1223 if (!decoder.checkAvailable(size)) { | 1215 if (!decoder.checkAvailable(size)) { |
1224 decoder.error("illegal asm function offset table size"); | 1216 decoder.error("illegal asm function offset table size"); |
1225 } | 1217 } |
1226 const byte* table_end = decoder.pc() + size; | 1218 const byte* table_end = decoder.pc() + size; |
(...skipping 13 matching lines...) Expand all Loading... |
1240 table.push_back(std::move(func_asm_offsets)); | 1232 table.push_back(std::move(func_asm_offsets)); |
1241 } | 1233 } |
1242 if (decoder.more()) decoder.error("unexpected additional bytes"); | 1234 if (decoder.more()) decoder.error("unexpected additional bytes"); |
1243 | 1235 |
1244 return decoder.toResult(std::move(table)); | 1236 return decoder.toResult(std::move(table)); |
1245 } | 1237 } |
1246 | 1238 |
1247 } // namespace wasm | 1239 } // namespace wasm |
1248 } // namespace internal | 1240 } // namespace internal |
1249 } // namespace v8 | 1241 } // namespace v8 |
OLD | NEW |