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

Side by Side Diff: src/wasm/asm-wasm-builder.cc

Issue 1571713002: [wasm] s/NULL/nullptr/g (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: DCHECK Created 4 years, 11 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 | « no previous file | src/wasm/encoder.h » ('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/v8.h" 5 #include "src/v8.h"
6 6
7 #include "src/wasm/asm-wasm-builder.h" 7 #include "src/wasm/asm-wasm-builder.h"
8 #include "src/wasm/wasm-macro-gen.h" 8 #include "src/wasm/wasm-macro-gen.h"
9 #include "src/wasm/wasm-opcodes.h" 9 #include "src/wasm/wasm-opcodes.h"
10 10
(...skipping 22 matching lines...) Expand all
33 ZoneAllocationPolicy(zone)), 33 ZoneAllocationPolicy(zone)),
34 functions_(HashMap::PointersMatch, ZoneHashMap::kDefaultHashMapCapacity, 34 functions_(HashMap::PointersMatch, ZoneHashMap::kDefaultHashMapCapacity,
35 ZoneAllocationPolicy(zone)), 35 ZoneAllocationPolicy(zone)),
36 global_variables_(HashMap::PointersMatch, 36 global_variables_(HashMap::PointersMatch,
37 ZoneHashMap::kDefaultHashMapCapacity, 37 ZoneHashMap::kDefaultHashMapCapacity,
38 ZoneAllocationPolicy(zone)), 38 ZoneAllocationPolicy(zone)),
39 in_function_(false), 39 in_function_(false),
40 is_set_op_(false), 40 is_set_op_(false),
41 marking_exported(false), 41 marking_exported(false),
42 builder_(new (zone) WasmModuleBuilder(zone)), 42 builder_(new (zone) WasmModuleBuilder(zone)),
43 current_function_builder_(NULL), 43 current_function_builder_(nullptr),
44 literal_(literal), 44 literal_(literal),
45 isolate_(isolate), 45 isolate_(isolate),
46 zone_(zone), 46 zone_(zone),
47 cache_(TypeCache::Get()), 47 cache_(TypeCache::Get()),
48 breakable_blocks_(zone), 48 breakable_blocks_(zone),
49 block_size_(0), 49 block_size_(0),
50 init_function_initialized(false), 50 init_function_initialized(false),
51 init_function_index(0) { 51 init_function_index(0) {
52 InitializeAstVisitor(isolate); 52 InitializeAstVisitor(isolate);
53 } 53 }
54 54
55 void Compile() { RECURSE(VisitFunctionLiteral(literal_)); } 55 void Compile() { RECURSE(VisitFunctionLiteral(literal_)); }
56 56
57 void VisitVariableDeclaration(VariableDeclaration* decl) {} 57 void VisitVariableDeclaration(VariableDeclaration* decl) {}
58 58
59 void VisitFunctionDeclaration(FunctionDeclaration* decl) { 59 void VisitFunctionDeclaration(FunctionDeclaration* decl) {
60 DCHECK(!in_function_); 60 DCHECK(!in_function_);
61 DCHECK(current_function_builder_ == NULL); 61 DCHECK(current_function_builder_ == nullptr);
62 uint16_t index = LookupOrInsertFunction(decl->proxy()->var()); 62 uint16_t index = LookupOrInsertFunction(decl->proxy()->var());
63 current_function_builder_ = builder_->FunctionAt(index); 63 current_function_builder_ = builder_->FunctionAt(index);
64 in_function_ = true; 64 in_function_ = true;
65 RECURSE(Visit(decl->fun())); 65 RECURSE(Visit(decl->fun()));
66 in_function_ = false; 66 in_function_ = false;
67 current_function_builder_ = NULL; 67 current_function_builder_ = nullptr;
68 local_variables_.Clear(); 68 local_variables_.Clear();
69 } 69 }
70 70
71 void VisitImportDeclaration(ImportDeclaration* decl) {} 71 void VisitImportDeclaration(ImportDeclaration* decl) {}
72 72
73 void VisitExportDeclaration(ExportDeclaration* decl) {} 73 void VisitExportDeclaration(ExportDeclaration* decl) {}
74 74
75 void VisitStatements(ZoneList<Statement*>* stmts) { 75 void VisitStatements(ZoneList<Statement*>* stmts) {
76 for (int i = 0; i < stmts->length(); ++i) { 76 for (int i = 0; i < stmts->length(); ++i) {
77 Statement* stmt = stmts->at(i); 77 Statement* stmt = stmts->at(i);
78 RECURSE(Visit(stmt)); 78 RECURSE(Visit(stmt));
79 if (stmt->IsJump()) break; 79 if (stmt->IsJump()) break;
80 } 80 }
81 } 81 }
82 82
83 void VisitBlock(Block* stmt) { 83 void VisitBlock(Block* stmt) {
84 if (stmt->statements()->length() == 1) { 84 if (stmt->statements()->length() == 1) {
85 ExpressionStatement* expr = 85 ExpressionStatement* expr =
86 stmt->statements()->at(0)->AsExpressionStatement(); 86 stmt->statements()->at(0)->AsExpressionStatement();
87 if (expr != NULL) { 87 if (expr != nullptr) {
88 if (expr->expression()->IsAssignment()) { 88 if (expr->expression()->IsAssignment()) {
89 RECURSE(VisitExpressionStatement(expr)); 89 RECURSE(VisitExpressionStatement(expr));
90 return; 90 return;
91 } 91 }
92 } 92 }
93 } 93 }
94 DCHECK(in_function_); 94 DCHECK(in_function_);
95 BlockVisitor visitor(this, stmt->AsBreakableStatement(), kExprBlock, false); 95 BlockVisitor visitor(this, stmt->AsBreakableStatement(), kExprBlock, false);
96 block_size_ = static_cast<byte>(stmt->statements()->length()); 96 block_size_ = static_cast<byte>(stmt->statements()->length());
97 RECURSE(VisitStatements(stmt->statements())); 97 RECURSE(VisitStatements(stmt->statements()));
(...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after
237 BlockVisitor visitor(this, stmt->AsBreakableStatement(), kExprLoop, true); 237 BlockVisitor visitor(this, stmt->AsBreakableStatement(), kExprLoop, true);
238 block_size_ = 1; 238 block_size_ = 1;
239 current_function_builder_->Emit(kExprIf); 239 current_function_builder_->Emit(kExprIf);
240 RECURSE(Visit(stmt->cond())); 240 RECURSE(Visit(stmt->cond()));
241 current_function_builder_->EmitWithU8(kExprBr, 0); 241 current_function_builder_->EmitWithU8(kExprBr, 0);
242 RECURSE(Visit(stmt->body())); 242 RECURSE(Visit(stmt->body()));
243 } 243 }
244 244
245 void VisitForStatement(ForStatement* stmt) { 245 void VisitForStatement(ForStatement* stmt) {
246 DCHECK(in_function_); 246 DCHECK(in_function_);
247 if (stmt->init() != NULL) { 247 if (stmt->init() != nullptr) {
248 block_size_++; 248 block_size_++;
249 RECURSE(Visit(stmt->init())); 249 RECURSE(Visit(stmt->init()));
250 } 250 }
251 BlockVisitor visitor(this, stmt->AsBreakableStatement(), kExprLoop, true); 251 BlockVisitor visitor(this, stmt->AsBreakableStatement(), kExprLoop, true);
252 block_size_ = 0; 252 block_size_ = 0;
253 if (stmt->cond() != NULL) { 253 if (stmt->cond() != nullptr) {
254 block_size_++; 254 block_size_++;
255 current_function_builder_->Emit(kExprIf); 255 current_function_builder_->Emit(kExprIf);
256 current_function_builder_->Emit(kExprBoolNot); 256 current_function_builder_->Emit(kExprBoolNot);
257 RECURSE(Visit(stmt->cond())); 257 RECURSE(Visit(stmt->cond()));
258 current_function_builder_->EmitWithU8(kExprBr, 1); 258 current_function_builder_->EmitWithU8(kExprBr, 1);
259 current_function_builder_->Emit(kExprNop); 259 current_function_builder_->Emit(kExprNop);
260 } 260 }
261 if (stmt->body() != NULL) { 261 if (stmt->body() != nullptr) {
262 block_size_++; 262 block_size_++;
263 RECURSE(Visit(stmt->body())); 263 RECURSE(Visit(stmt->body()));
264 } 264 }
265 if (stmt->next() != NULL) { 265 if (stmt->next() != nullptr) {
266 block_size_++; 266 block_size_++;
267 RECURSE(Visit(stmt->next())); 267 RECURSE(Visit(stmt->next()));
268 } 268 }
269 block_size_++; 269 block_size_++;
270 current_function_builder_->EmitWithU8(kExprBr, 0); 270 current_function_builder_->EmitWithU8(kExprBr, 0);
271 current_function_builder_->Emit(kExprNop); 271 current_function_builder_->Emit(kExprNop);
272 } 272 }
273 273
274 void VisitForInStatement(ForInStatement* stmt) { UNREACHABLE(); } 274 void VisitForInStatement(ForInStatement* stmt) { UNREACHABLE(); }
275 275
(...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after
406 current_function_builder_->Exported(1); 406 current_function_builder_->Exported(1);
407 in_function_ = true; 407 in_function_ = true;
408 } else { 408 } else {
409 current_function_builder_ = builder_->FunctionAt(init_function_index); 409 current_function_builder_ = builder_->FunctionAt(init_function_index);
410 in_function_ = true; 410 in_function_ = true;
411 } 411 }
412 } 412 }
413 413
414 void UnLoadInitFunction() { 414 void UnLoadInitFunction() {
415 in_function_ = false; 415 in_function_ = false;
416 current_function_builder_ = NULL; 416 current_function_builder_ = nullptr;
417 } 417 }
418 418
419 void VisitAssignment(Assignment* expr) { 419 void VisitAssignment(Assignment* expr) {
420 bool in_init = false; 420 bool in_init = false;
421 if (!in_function_) { 421 if (!in_function_) {
422 // TODO(bradnelson): Get rid of this. 422 // TODO(bradnelson): Get rid of this.
423 if (TypeOf(expr->value()) == kAstStmt) { 423 if (TypeOf(expr->value()) == kAstStmt) {
424 return; 424 return;
425 } 425 }
426 in_init = true; 426 in_init = true;
427 LoadInitFunction(); 427 LoadInitFunction();
428 } 428 }
429 BinaryOperation* value_op = expr->value()->AsBinaryOperation(); 429 BinaryOperation* value_op = expr->value()->AsBinaryOperation();
430 if (value_op != NULL && MatchBinaryOperation(value_op) == kAsIs) { 430 if (value_op != nullptr && MatchBinaryOperation(value_op) == kAsIs) {
431 VariableProxy* target_var = expr->target()->AsVariableProxy(); 431 VariableProxy* target_var = expr->target()->AsVariableProxy();
432 VariableProxy* effective_value_var = GetLeft(value_op)->AsVariableProxy(); 432 VariableProxy* effective_value_var = GetLeft(value_op)->AsVariableProxy();
433 // TODO(aseemgarg): simplify block_size_ or replace with a kNop 433 // TODO(aseemgarg): simplify block_size_ or replace with a kNop
434 if (target_var != NULL && effective_value_var != NULL && 434 if (target_var != nullptr && effective_value_var != nullptr &&
435 target_var->var() == effective_value_var->var()) { 435 target_var->var() == effective_value_var->var()) {
436 block_size_--; 436 block_size_--;
437 return; 437 return;
438 } 438 }
439 } 439 }
440 is_set_op_ = true; 440 is_set_op_ = true;
441 RECURSE(Visit(expr->target())); 441 RECURSE(Visit(expr->target()));
442 DCHECK(!is_set_op_); 442 DCHECK(!is_set_op_);
443 RECURSE(Visit(expr->value())); 443 RECURSE(Visit(expr->value()));
444 if (in_init) { 444 if (in_init) {
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after
550 default: 550 default:
551 UNREACHABLE(); 551 UNREACHABLE();
552 } 552 }
553 RECURSE(Visit(expr->expression())); 553 RECURSE(Visit(expr->expression()));
554 } 554 }
555 555
556 void VisitCountOperation(CountOperation* expr) { UNREACHABLE(); } 556 void VisitCountOperation(CountOperation* expr) { UNREACHABLE(); }
557 557
558 bool MatchIntBinaryOperation(BinaryOperation* expr, Token::Value op, 558 bool MatchIntBinaryOperation(BinaryOperation* expr, Token::Value op,
559 int32_t val) { 559 int32_t val) {
560 DCHECK(expr->right() != NULL); 560 DCHECK(expr->right() != nullptr);
561 if (expr->op() == op && expr->right()->IsLiteral() && 561 if (expr->op() == op && expr->right()->IsLiteral() &&
562 TypeOf(expr) == kAstI32) { 562 TypeOf(expr) == kAstI32) {
563 Literal* right = expr->right()->AsLiteral(); 563 Literal* right = expr->right()->AsLiteral();
564 DCHECK(right->raw_value()->IsNumber()); 564 DCHECK(right->raw_value()->IsNumber());
565 if (static_cast<int32_t>(right->raw_value()->AsNumber()) == val) { 565 if (static_cast<int32_t>(right->raw_value()->AsNumber()) == val) {
566 return true; 566 return true;
567 } 567 }
568 } 568 }
569 return false; 569 return false;
570 } 570 }
571 571
572 bool MatchDoubleBinaryOperation(BinaryOperation* expr, Token::Value op, 572 bool MatchDoubleBinaryOperation(BinaryOperation* expr, Token::Value op,
573 double val) { 573 double val) {
574 DCHECK(expr->right() != NULL); 574 DCHECK(expr->right() != nullptr);
575 if (expr->op() == op && expr->right()->IsLiteral() && 575 if (expr->op() == op && expr->right()->IsLiteral() &&
576 TypeOf(expr) == kAstF64) { 576 TypeOf(expr) == kAstF64) {
577 Literal* right = expr->right()->AsLiteral(); 577 Literal* right = expr->right()->AsLiteral();
578 DCHECK(right->raw_value()->IsNumber()); 578 DCHECK(right->raw_value()->IsNumber());
579 if (right->raw_value()->AsNumber() == val) { 579 if (right->raw_value()->AsNumber() == val) {
580 return true; 580 return true;
581 } 581 }
582 } 582 }
583 return false; 583 return false;
584 } 584 }
(...skipping 18 matching lines...) Expand all
603 } else { 603 } else {
604 return kNone; 604 return kNone;
605 } 605 }
606 } 606 }
607 607
608 ConvertOperation MatchXor(BinaryOperation* expr) { 608 ConvertOperation MatchXor(BinaryOperation* expr) {
609 if (MatchIntBinaryOperation(expr, Token::BIT_XOR, 0xffffffff)) { 609 if (MatchIntBinaryOperation(expr, Token::BIT_XOR, 0xffffffff)) {
610 DCHECK(TypeOf(expr->left()) == kAstI32); 610 DCHECK(TypeOf(expr->left()) == kAstI32);
611 DCHECK(TypeOf(expr->right()) == kAstI32); 611 DCHECK(TypeOf(expr->right()) == kAstI32);
612 BinaryOperation* op = expr->left()->AsBinaryOperation(); 612 BinaryOperation* op = expr->left()->AsBinaryOperation();
613 if (op != NULL) { 613 if (op != nullptr) {
614 if (MatchIntBinaryOperation(op, Token::BIT_XOR, 0xffffffff)) { 614 if (MatchIntBinaryOperation(op, Token::BIT_XOR, 0xffffffff)) {
615 DCHECK(TypeOf(op->right()) == kAstI32); 615 DCHECK(TypeOf(op->right()) == kAstI32);
616 if (TypeOf(op->left()) != kAstI32) { 616 if (TypeOf(op->left()) != kAstI32) {
617 return kToInt; 617 return kToInt;
618 } else { 618 } else {
619 return kAsIs; 619 return kAsIs;
620 } 620 }
621 } 621 }
622 } 622 }
623 } 623 }
(...skipping 268 matching lines...) Expand 10 before | Expand all | Expand 10 after
892 void VisitRewritableAssignmentExpression( 892 void VisitRewritableAssignmentExpression(
893 RewritableAssignmentExpression* expr) { 893 RewritableAssignmentExpression* expr) {
894 UNREACHABLE(); 894 UNREACHABLE();
895 } 895 }
896 896
897 struct IndexContainer : public ZoneObject { 897 struct IndexContainer : public ZoneObject {
898 uint16_t index; 898 uint16_t index;
899 }; 899 };
900 900
901 uint16_t LookupOrInsertLocal(Variable* v, LocalType type) { 901 uint16_t LookupOrInsertLocal(Variable* v, LocalType type) {
902 DCHECK(current_function_builder_ != NULL); 902 DCHECK(current_function_builder_ != nullptr);
903 ZoneHashMap::Entry* entry = 903 ZoneHashMap::Entry* entry =
904 local_variables_.Lookup(v, ComputePointerHash(v)); 904 local_variables_.Lookup(v, ComputePointerHash(v));
905 if (entry == NULL) { 905 if (entry == nullptr) {
906 uint16_t index; 906 uint16_t index;
907 if (v->IsParameter()) { 907 if (v->IsParameter()) {
908 index = current_function_builder_->AddParam(type); 908 index = current_function_builder_->AddParam(type);
909 } else { 909 } else {
910 index = current_function_builder_->AddLocal(type); 910 index = current_function_builder_->AddLocal(type);
911 } 911 }
912 IndexContainer* container = new (zone()) IndexContainer(); 912 IndexContainer* container = new (zone()) IndexContainer();
913 container->index = index; 913 container->index = index;
914 entry = local_variables_.LookupOrInsert(v, ComputePointerHash(v), 914 entry = local_variables_.LookupOrInsert(v, ComputePointerHash(v),
915 ZoneAllocationPolicy(zone())); 915 ZoneAllocationPolicy(zone()));
916 entry->value = container; 916 entry->value = container;
917 } 917 }
918 return (reinterpret_cast<IndexContainer*>(entry->value))->index; 918 return (reinterpret_cast<IndexContainer*>(entry->value))->index;
919 } 919 }
920 920
921 uint16_t LookupOrInsertGlobal(Variable* v, LocalType type) { 921 uint16_t LookupOrInsertGlobal(Variable* v, LocalType type) {
922 ZoneHashMap::Entry* entry = 922 ZoneHashMap::Entry* entry =
923 global_variables_.Lookup(v, ComputePointerHash(v)); 923 global_variables_.Lookup(v, ComputePointerHash(v));
924 if (entry == NULL) { 924 if (entry == nullptr) {
925 uint16_t index = 925 uint16_t index =
926 builder_->AddGlobal(WasmOpcodes::MachineTypeFor(type), 0); 926 builder_->AddGlobal(WasmOpcodes::MachineTypeFor(type), 0);
927 IndexContainer* container = new (zone()) IndexContainer(); 927 IndexContainer* container = new (zone()) IndexContainer();
928 container->index = index; 928 container->index = index;
929 entry = global_variables_.LookupOrInsert(v, ComputePointerHash(v), 929 entry = global_variables_.LookupOrInsert(v, ComputePointerHash(v),
930 ZoneAllocationPolicy(zone())); 930 ZoneAllocationPolicy(zone()));
931 entry->value = container; 931 entry->value = container;
932 } 932 }
933 return (reinterpret_cast<IndexContainer*>(entry->value))->index; 933 return (reinterpret_cast<IndexContainer*>(entry->value))->index;
934 } 934 }
935 935
936 uint16_t LookupOrInsertFunction(Variable* v) { 936 uint16_t LookupOrInsertFunction(Variable* v) {
937 DCHECK(builder_ != NULL); 937 DCHECK(builder_ != nullptr);
938 ZoneHashMap::Entry* entry = functions_.Lookup(v, ComputePointerHash(v)); 938 ZoneHashMap::Entry* entry = functions_.Lookup(v, ComputePointerHash(v));
939 if (entry == NULL) { 939 if (entry == nullptr) {
940 uint16_t index = builder_->AddFunction(v->raw_name()->raw_data(), 940 uint16_t index = builder_->AddFunction(v->raw_name()->raw_data(),
941 v->raw_name()->length()); 941 v->raw_name()->length());
942 IndexContainer* container = new (zone()) IndexContainer(); 942 IndexContainer* container = new (zone()) IndexContainer();
943 container->index = index; 943 container->index = index;
944 entry = functions_.LookupOrInsert(v, ComputePointerHash(v), 944 entry = functions_.LookupOrInsert(v, ComputePointerHash(v),
945 ZoneAllocationPolicy(zone())); 945 ZoneAllocationPolicy(zone()));
946 entry->value = container; 946 entry->value = container;
947 } 947 }
948 return (reinterpret_cast<IndexContainer*>(entry->value))->index; 948 return (reinterpret_cast<IndexContainer*>(entry->value))->index;
949 } 949 }
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
998 // that zone in constructor may be thrown away once wasm module is written. 998 // that zone in constructor may be thrown away once wasm module is written.
999 WasmModuleIndex* AsmWasmBuilder::Run() { 999 WasmModuleIndex* AsmWasmBuilder::Run() {
1000 AsmWasmBuilderImpl impl(isolate_, zone_, literal_); 1000 AsmWasmBuilderImpl impl(isolate_, zone_, literal_);
1001 impl.Compile(); 1001 impl.Compile();
1002 WasmModuleWriter* writer = impl.builder_->Build(zone_); 1002 WasmModuleWriter* writer = impl.builder_->Build(zone_);
1003 return writer->WriteTo(zone_); 1003 return writer->WriteTo(zone_);
1004 } 1004 }
1005 } // namespace wasm 1005 } // namespace wasm
1006 } // namespace internal 1006 } // namespace internal
1007 } // namespace v8 1007 } // namespace v8
OLDNEW
« no previous file with comments | « no previous file | src/wasm/encoder.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698