| OLD | NEW |
| 1 // Copyright 2016 the V8 project authors. All rights reserved. | 1 // Copyright 2016 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 #ifndef WASM_RUN_UTILS_H | 5 #ifndef WASM_RUN_UTILS_H |
| 6 #define WASM_RUN_UTILS_H | 6 #define WASM_RUN_UTILS_H |
| 7 | 7 |
| 8 #include <stdint.h> | 8 #include <stdint.h> |
| 9 #include <stdlib.h> | 9 #include <stdlib.h> |
| 10 #include <string.h> | 10 #include <string.h> |
| (...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 161 AllocModule(); | 161 AllocModule(); |
| 162 if (module->functions == nullptr) { | 162 if (module->functions == nullptr) { |
| 163 module->functions = new std::vector<WasmFunction>(); | 163 module->functions = new std::vector<WasmFunction>(); |
| 164 function_code = new std::vector<Handle<Code>>(); | 164 function_code = new std::vector<Handle<Code>>(); |
| 165 } | 165 } |
| 166 module->functions->push_back({sig, 0, 0, 0, 0, 0, 0, 0, false, false}); | 166 module->functions->push_back({sig, 0, 0, 0, 0, 0, 0, 0, false, false}); |
| 167 function_code->push_back(code); | 167 function_code->push_back(code); |
| 168 return &module->functions->back(); | 168 return &module->functions->back(); |
| 169 } | 169 } |
| 170 | 170 |
| 171 void AddIndirectFunctionTable(int* functions, int table_size) { |
| 172 AllocModule(); |
| 173 Isolate* isolate = module->shared_isolate; |
| 174 Handle<FixedArray> fixed = |
| 175 isolate->factory()->NewFixedArray(2 * table_size); |
| 176 function_table = fixed; |
| 177 module->function_table = new std::vector<uint16_t>(); |
| 178 for (int i = 0; i < table_size; i++) { |
| 179 module->function_table->push_back(functions[i]); |
| 180 } |
| 181 } |
| 182 |
| 183 void PopulateIndirectFunctionTable() { |
| 184 if (function_table.is_null()) return; |
| 185 int table_size = static_cast<int>(module->function_table->size()); |
| 186 for (int i = 0; i < table_size; i++) { |
| 187 int function_index = module->function_table->at(i); |
| 188 WasmFunction* function = &module->functions->at(function_index); |
| 189 function_table->set(i, Smi::FromInt(function->sig_index)); |
| 190 function_table->set(i + table_size, *function_code->at(function_index)); |
| 191 } |
| 192 } |
| 193 |
| 194 |
| 171 private: | 195 private: |
| 172 size_t mem_size; | 196 size_t mem_size; |
| 173 uint32_t global_offset; | 197 uint32_t global_offset; |
| 174 byte global_data[kMaxGlobalsSize]; | 198 byte global_data[kMaxGlobalsSize]; |
| 175 | 199 |
| 176 WasmGlobal* AddGlobal(MachineType mem_type) { | 200 WasmGlobal* AddGlobal(MachineType mem_type) { |
| 177 AllocModule(); | 201 AllocModule(); |
| 178 if (globals_area == 0) { | 202 if (globals_area == 0) { |
| 179 globals_area = reinterpret_cast<uintptr_t>(global_data); | 203 globals_area = reinterpret_cast<uintptr_t>(global_data); |
| 180 module->globals = new std::vector<WasmGlobal>(); | 204 module->globals = new std::vector<WasmGlobal>(); |
| (...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 264 #ifdef ENABLE_DISASSEMBLER | 288 #ifdef ENABLE_DISASSEMBLER |
| 265 if (!result.is_null() && FLAG_print_opt_code) { | 289 if (!result.is_null() && FLAG_print_opt_code) { |
| 266 OFStream os(stdout); | 290 OFStream os(stdout); |
| 267 result->Disassemble("wasm code", os); | 291 result->Disassemble("wasm code", os); |
| 268 } | 292 } |
| 269 #endif | 293 #endif |
| 270 | 294 |
| 271 return result; | 295 return result; |
| 272 } | 296 } |
| 273 | 297 |
| 274 uint32_t CompileAndAdd(TestingModule* module) { | 298 uint32_t CompileAndAdd(TestingModule* module, int sig_index = 0) { |
| 275 uint32_t index = 0; | 299 uint32_t index = 0; |
| 276 if (module->module && module->module->functions) { | 300 if (module->module && module->module->functions) { |
| 277 index = static_cast<uint32_t>(module->module->functions->size()); | 301 index = static_cast<uint32_t>(module->module->functions->size()); |
| 278 } | 302 } |
| 279 module->AddFunction(env.sig, Compile(module)); | 303 WasmFunction* function = module->AddFunction(env.sig, Compile(module)); |
| 304 function->sig_index = sig_index; |
| 280 return index; | 305 return index; |
| 281 } | 306 } |
| 282 }; | 307 }; |
| 283 | 308 |
| 284 | 309 |
| 285 // A helper class to build graphs from Wasm bytecode, generate machine | 310 // A helper class to build graphs from Wasm bytecode, generate machine |
| 286 // code, and run that code. | 311 // code, and run that code. |
| 287 template <typename ReturnType> | 312 template <typename ReturnType> |
| 288 class WasmRunner { | 313 class WasmRunner { |
| 289 public: | 314 public: |
| (...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 382 if (p1 == MachineType::None()) return 1; | 407 if (p1 == MachineType::None()) return 1; |
| 383 if (p2 == MachineType::None()) return 2; | 408 if (p2 == MachineType::None()) return 2; |
| 384 if (p3 == MachineType::None()) return 3; | 409 if (p3 == MachineType::None()) return 3; |
| 385 return 4; | 410 return 4; |
| 386 } | 411 } |
| 387 }; | 412 }; |
| 388 | 413 |
| 389 } // namespace | 414 } // namespace |
| 390 | 415 |
| 391 #endif | 416 #endif |
| OLD | NEW |