Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(7)

Side by Side Diff: src/wasm/ast-decoder.cc

Issue 2285643002: [wasm] Validate the alignment of load and store instructions. (Closed)
Patch Set: Add alignment and maximum alignment information to the error message. Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/wasm/ast-decoder.h ('k') | src/wasm/wasm-interpreter.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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/signature.h" 5 #include "src/signature.h"
6 6
7 #include "src/bit-vector.h" 7 #include "src/bit-vector.h"
8 #include "src/flags.h" 8 #include "src/flags.h"
9 #include "src/handles.h" 9 #include "src/handles.h"
10 #include "src/zone-containers.h" 10 #include "src/zone-containers.h"
(...skipping 383 matching lines...) Expand 10 before | Expand all | Expand 10 after
394 } 394 }
395 } 395 }
396 396
397 unsigned OpcodeLength(const byte* pc) { 397 unsigned OpcodeLength(const byte* pc) {
398 switch (static_cast<WasmOpcode>(*pc)) { 398 switch (static_cast<WasmOpcode>(*pc)) {
399 #define DECLARE_OPCODE_CASE(name, opcode, sig) case kExpr##name: 399 #define DECLARE_OPCODE_CASE(name, opcode, sig) case kExpr##name:
400 FOREACH_LOAD_MEM_OPCODE(DECLARE_OPCODE_CASE) 400 FOREACH_LOAD_MEM_OPCODE(DECLARE_OPCODE_CASE)
401 FOREACH_STORE_MEM_OPCODE(DECLARE_OPCODE_CASE) 401 FOREACH_STORE_MEM_OPCODE(DECLARE_OPCODE_CASE)
402 #undef DECLARE_OPCODE_CASE 402 #undef DECLARE_OPCODE_CASE
403 { 403 {
404 MemoryAccessOperand operand(this, pc); 404 MemoryAccessOperand operand(this, pc, UINT32_MAX);
405 return 1 + operand.length; 405 return 1 + operand.length;
406 } 406 }
407 case kExprBr: 407 case kExprBr:
408 case kExprBrIf: { 408 case kExprBrIf: {
409 BreakDepthOperand operand(this, pc); 409 BreakDepthOperand operand(this, pc);
410 return 1 + operand.length; 410 return 1 + operand.length;
411 } 411 }
412 case kExprSetGlobal: 412 case kExprSetGlobal:
413 case kExprGetGlobal: { 413 case kExprGetGlobal: {
414 GlobalIndexOperand operand(this, pc); 414 GlobalIndexOperand operand(this, pc);
(...skipping 956 matching lines...) Expand 10 before | Expand all | Expand 10 after
1371 } 1371 }
1372 1372
1373 void PopControl() { 1373 void PopControl() {
1374 const Control& c = control_.back(); 1374 const Control& c = control_.back();
1375 most_recent_finally_ = c.prev_finally; 1375 most_recent_finally_ = c.prev_finally;
1376 control_.pop_back(); 1376 control_.pop_back();
1377 // No more accesses to (danging pointer) c 1377 // No more accesses to (danging pointer) c
1378 } 1378 }
1379 1379
1380 int DecodeLoadMem(LocalType type, MachineType mem_type) { 1380 int DecodeLoadMem(LocalType type, MachineType mem_type) {
1381 MemoryAccessOperand operand(this, pc_); 1381 MemoryAccessOperand operand(this, pc_,
1382 ElementSizeLog2Of(mem_type.representation()));
1383
1382 Value index = Pop(0, kAstI32); 1384 Value index = Pop(0, kAstI32);
1383 TFNode* node = BUILD(LoadMem, type, mem_type, index.node, operand.offset, 1385 TFNode* node = BUILD(LoadMem, type, mem_type, index.node, operand.offset,
1384 operand.alignment, position()); 1386 operand.alignment, position());
1385 Push(type, node); 1387 Push(type, node);
1386 return 1 + operand.length; 1388 return 1 + operand.length;
1387 } 1389 }
1388 1390
1389 int DecodeStoreMem(LocalType type, MachineType mem_type) { 1391 int DecodeStoreMem(LocalType type, MachineType mem_type) {
1390 MemoryAccessOperand operand(this, pc_); 1392 MemoryAccessOperand operand(this, pc_,
1393 ElementSizeLog2Of(mem_type.representation()));
1391 Value val = Pop(1, type); 1394 Value val = Pop(1, type);
1392 Value index = Pop(0, kAstI32); 1395 Value index = Pop(0, kAstI32);
1393 BUILD(StoreMem, mem_type, index.node, operand.offset, operand.alignment, 1396 BUILD(StoreMem, mem_type, index.node, operand.offset, operand.alignment,
1394 val.node, position()); 1397 val.node, position());
1395 Push(type, val.node); 1398 Push(type, val.node);
1396 return 1 + operand.length; 1399 return 1 + operand.length;
1397 } 1400 }
1398 1401
1399 void DecodeSimdOpcode(WasmOpcode opcode) { 1402 void DecodeSimdOpcode(WasmOpcode opcode) {
1400 FunctionSig* sig = WasmOpcodes::Signature(opcode); 1403 FunctionSig* sig = WasmOpcodes::Signature(opcode);
(...skipping 663 matching lines...) Expand 10 before | Expand all | Expand 10 after
2064 BitVector* AnalyzeLoopAssignmentForTesting(Zone* zone, size_t num_locals, 2067 BitVector* AnalyzeLoopAssignmentForTesting(Zone* zone, size_t num_locals,
2065 const byte* start, const byte* end) { 2068 const byte* start, const byte* end) {
2066 FunctionBody body = {nullptr, nullptr, nullptr, start, end}; 2069 FunctionBody body = {nullptr, nullptr, nullptr, start, end};
2067 WasmFullDecoder decoder(zone, nullptr, body); 2070 WasmFullDecoder decoder(zone, nullptr, body);
2068 return decoder.AnalyzeLoopAssignmentForTesting(start, num_locals); 2071 return decoder.AnalyzeLoopAssignmentForTesting(start, num_locals);
2069 } 2072 }
2070 2073
2071 } // namespace wasm 2074 } // namespace wasm
2072 } // namespace internal 2075 } // namespace internal
2073 } // namespace v8 2076 } // namespace v8
OLDNEW
« no previous file with comments | « src/wasm/ast-decoder.h ('k') | src/wasm/wasm-interpreter.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698