Chromium Code Reviews| 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 #ifndef V8_WASM_AST_DECODER_H_ | 5 #ifndef V8_WASM_FUNCTION_BODY_DECODER_H_ |
| 6 #define V8_WASM_AST_DECODER_H_ | 6 #define V8_WASM_FUNCTION_BODY_DECODER_H_ |
| 7 | 7 |
| 8 #include <iterator> | 8 #include <iterator> |
| 9 | 9 |
| 10 #include "src/base/compiler-specific.h" | 10 #include "src/base/compiler-specific.h" |
| 11 #include "src/base/iterator.h" | 11 #include "src/base/iterator.h" |
| 12 #include "src/globals.h" | 12 #include "src/globals.h" |
| 13 #include "src/signature.h" | 13 #include "src/signature.h" |
| 14 #include "src/wasm/decoder.h" | 14 #include "src/wasm/decoder.h" |
| 15 #include "src/wasm/wasm-opcodes.h" | 15 #include "src/wasm/wasm-opcodes.h" |
| 16 #include "src/wasm/wasm-result.h" | 16 #include "src/wasm/wasm-result.h" |
| (...skipping 312 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 329 }; | 329 }; |
| 330 typedef Result<DecodeStruct*> DecodeResult; | 330 typedef Result<DecodeStruct*> DecodeResult; |
| 331 inline std::ostream& operator<<(std::ostream& os, const DecodeStruct& tree) { | 331 inline std::ostream& operator<<(std::ostream& os, const DecodeStruct& tree) { |
| 332 return os; | 332 return os; |
| 333 } | 333 } |
| 334 | 334 |
| 335 V8_EXPORT_PRIVATE DecodeResult VerifyWasmCode(AccountingAllocator* allocator, | 335 V8_EXPORT_PRIVATE DecodeResult VerifyWasmCode(AccountingAllocator* allocator, |
| 336 FunctionBody& body); | 336 FunctionBody& body); |
| 337 DecodeResult BuildTFGraph(AccountingAllocator* allocator, TFBuilder* builder, | 337 DecodeResult BuildTFGraph(AccountingAllocator* allocator, TFBuilder* builder, |
| 338 FunctionBody& body); | 338 FunctionBody& body); |
| 339 bool PrintAst(AccountingAllocator* allocator, const FunctionBody& body, | 339 bool PrintWasmCode(AccountingAllocator* allocator, const FunctionBody& body, |
| 340 std::ostream& os, | 340 std::ostream& os, |
| 341 std::vector<std::tuple<uint32_t, int, int>>* offset_table); | 341 std::vector<std::tuple<uint32_t, int, int>>* offset_table); |
|
Clemens Hammacher
2016/12/21 12:32:42
At some point I should remove this offset_table. I
| |
| 342 | 342 |
| 343 // A simplified form of AST printing, e.g. from a debugger. | 343 // A simplified form of AST printing, e.g. from a debugger. |
| 344 void PrintAstForDebugging(const byte* start, const byte* end); | 344 void PrintWasmCodeForDebugging(const byte* start, const byte* end); |
| 345 | 345 |
| 346 inline DecodeResult VerifyWasmCode(AccountingAllocator* allocator, | 346 inline DecodeResult VerifyWasmCode(AccountingAllocator* allocator, |
| 347 ModuleEnv* module, FunctionSig* sig, | 347 ModuleEnv* module, FunctionSig* sig, |
| 348 const byte* start, const byte* end) { | 348 const byte* start, const byte* end) { |
| 349 FunctionBody body = {module, sig, nullptr, start, end}; | 349 FunctionBody body = {module, sig, nullptr, start, end}; |
| 350 return VerifyWasmCode(allocator, body); | 350 return VerifyWasmCode(allocator, body); |
| 351 } | 351 } |
| 352 | 352 |
| 353 inline DecodeResult BuildTFGraph(AccountingAllocator* allocator, | 353 inline DecodeResult BuildTFGraph(AccountingAllocator* allocator, |
| 354 TFBuilder* builder, ModuleEnv* module, | 354 TFBuilder* builder, ModuleEnv* module, |
| 355 FunctionSig* sig, const byte* start, | 355 FunctionSig* sig, const byte* start, |
| 356 const byte* end) { | 356 const byte* end) { |
| 357 FunctionBody body = {module, sig, nullptr, start, end}; | 357 FunctionBody body = {module, sig, nullptr, start, end}; |
| 358 return BuildTFGraph(allocator, builder, body); | 358 return BuildTFGraph(allocator, builder, body); |
| 359 } | 359 } |
| 360 | 360 |
| 361 struct AstLocalDecls { | 361 struct BodyLocalDecls { |
| 362 // The size of the encoded declarations. | 362 // The size of the encoded declarations. |
| 363 uint32_t decls_encoded_size; // size of encoded declarations | 363 uint32_t decls_encoded_size; // size of encoded declarations |
| 364 | 364 |
| 365 // Total number of locals. | 365 // Total number of locals. |
| 366 uint32_t total_local_count; | 366 uint32_t total_local_count; |
| 367 | 367 |
| 368 // List of {local type, count} pairs. | 368 // List of {local type, count} pairs. |
| 369 ZoneVector<std::pair<LocalType, uint32_t>> local_types; | 369 ZoneVector<std::pair<LocalType, uint32_t>> local_types; |
| 370 | 370 |
| 371 // Constructor initializes the vector. | 371 // Constructor initializes the vector. |
| 372 explicit AstLocalDecls(Zone* zone) | 372 explicit BodyLocalDecls(Zone* zone) |
| 373 : decls_encoded_size(0), total_local_count(0), local_types(zone) {} | 373 : decls_encoded_size(0), total_local_count(0), local_types(zone) {} |
| 374 }; | 374 }; |
| 375 | 375 |
| 376 V8_EXPORT_PRIVATE bool DecodeLocalDecls(AstLocalDecls& decls, const byte* start, | 376 V8_EXPORT_PRIVATE bool DecodeLocalDecls(BodyLocalDecls& decls, |
| 377 const byte* end); | 377 const byte* start, const byte* end); |
| 378 V8_EXPORT_PRIVATE BitVector* AnalyzeLoopAssignmentForTesting(Zone* zone, | 378 V8_EXPORT_PRIVATE BitVector* AnalyzeLoopAssignmentForTesting(Zone* zone, |
| 379 size_t num_locals, | 379 size_t num_locals, |
| 380 const byte* start, | 380 const byte* start, |
| 381 const byte* end); | 381 const byte* end); |
| 382 | 382 |
| 383 // Computes the length of the opcode at the given address. | 383 // Computes the length of the opcode at the given address. |
| 384 V8_EXPORT_PRIVATE unsigned OpcodeLength(const byte* pc, const byte* end); | 384 V8_EXPORT_PRIVATE unsigned OpcodeLength(const byte* pc, const byte* end); |
| 385 | 385 |
| 386 // A simple forward iterator for bytecodes. | 386 // A simple forward iterator for bytecodes. |
| 387 class V8_EXPORT_PRIVATE BytecodeIterator : public NON_EXPORTED_BASE(Decoder) { | 387 class V8_EXPORT_PRIVATE BytecodeIterator : public NON_EXPORTED_BASE(Decoder) { |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 437 const byte* start_; | 437 const byte* start_; |
| 438 friend class BytecodeIterator; | 438 friend class BytecodeIterator; |
| 439 offset_iterator(const byte* start, const byte* ptr, const byte* end) | 439 offset_iterator(const byte* start, const byte* ptr, const byte* end) |
| 440 : iterator_base(ptr, end), start_(start) {} | 440 : iterator_base(ptr, end), start_(start) {} |
| 441 }; | 441 }; |
| 442 | 442 |
| 443 // Create a new {BytecodeIterator}. If the {decls} pointer is non-null, | 443 // Create a new {BytecodeIterator}. If the {decls} pointer is non-null, |
| 444 // assume the bytecode starts with local declarations and decode them. | 444 // assume the bytecode starts with local declarations and decode them. |
| 445 // Otherwise, do not decode local decls. | 445 // Otherwise, do not decode local decls. |
| 446 BytecodeIterator(const byte* start, const byte* end, | 446 BytecodeIterator(const byte* start, const byte* end, |
| 447 AstLocalDecls* decls = nullptr); | 447 BodyLocalDecls* decls = nullptr); |
| 448 | 448 |
| 449 base::iterator_range<opcode_iterator> opcodes() { | 449 base::iterator_range<opcode_iterator> opcodes() { |
| 450 return base::iterator_range<opcode_iterator>(opcode_iterator(pc_, end_), | 450 return base::iterator_range<opcode_iterator>(opcode_iterator(pc_, end_), |
| 451 opcode_iterator(end_, end_)); | 451 opcode_iterator(end_, end_)); |
| 452 } | 452 } |
| 453 | 453 |
| 454 base::iterator_range<offset_iterator> offsets() { | 454 base::iterator_range<offset_iterator> offsets() { |
| 455 return base::iterator_range<offset_iterator>( | 455 return base::iterator_range<offset_iterator>( |
| 456 offset_iterator(start_, pc_, end_), | 456 offset_iterator(start_, pc_, end_), |
| 457 offset_iterator(start_, end_, end_)); | 457 offset_iterator(start_, end_, end_)); |
| (...skipping 11 matching lines...) Expand all Loading... | |
| 469 } | 469 } |
| 470 } | 470 } |
| 471 | 471 |
| 472 bool has_next() { return pc_ < end_; } | 472 bool has_next() { return pc_ < end_; } |
| 473 }; | 473 }; |
| 474 | 474 |
| 475 } // namespace wasm | 475 } // namespace wasm |
| 476 } // namespace internal | 476 } // namespace internal |
| 477 } // namespace v8 | 477 } // namespace v8 |
| 478 | 478 |
| 479 #endif // V8_WASM_AST_DECODER_H_ | 479 #endif // V8_WASM_FUNCTION_BODY_DECODER_H_ |
| OLD | NEW |