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

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

Issue 1980543002: [wasm] Remove renumbering of local variables from asm->wasm. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@wasm_renumber
Patch Set: Fix memory leak by using a zone Created 4 years, 7 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 // Required to get M_E etc. in MSVC. 7 // Required to get M_E etc. in MSVC.
8 #if defined(_WIN32) 8 #if defined(_WIN32)
9 #define _USE_MATH_DEFINES 9 #define _USE_MATH_DEFINES
10 #endif 10 #endif
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
60 function_tables_(HashMap::PointersMatch, 60 function_tables_(HashMap::PointersMatch,
61 ZoneHashMap::kDefaultHashMapCapacity, 61 ZoneHashMap::kDefaultHashMapCapacity,
62 ZoneAllocationPolicy(zone)), 62 ZoneAllocationPolicy(zone)),
63 imported_function_table_(this), 63 imported_function_table_(this),
64 bounds_(typer->bounds()) { 64 bounds_(typer->bounds()) {
65 InitializeAstVisitor(isolate); 65 InitializeAstVisitor(isolate);
66 } 66 }
67 67
68 void InitializeInitFunction() { 68 void InitializeInitFunction() {
69 init_function_index_ = builder_->AddFunction(); 69 init_function_index_ = builder_->AddFunction();
70 FunctionSig::Builder b(zone(), 0, 0);
70 current_function_builder_ = builder_->FunctionAt(init_function_index_); 71 current_function_builder_ = builder_->FunctionAt(init_function_index_);
71 current_function_builder_->ReturnType(kAstStmt); 72 current_function_builder_->SetSignature(b.Build());
72 builder_->MarkStartFunction(init_function_index_); 73 builder_->MarkStartFunction(init_function_index_);
73 current_function_builder_ = nullptr; 74 current_function_builder_ = nullptr;
74 } 75 }
75 76
76 void Compile() { 77 void Compile() {
77 InitializeInitFunction(); 78 InitializeInitFunction();
78 RECURSE(VisitFunctionLiteral(literal_)); 79 RECURSE(VisitFunctionLiteral(literal_));
79 } 80 }
80 81
81 void VisitVariableDeclaration(VariableDeclaration* decl) {} 82 void VisitVariableDeclaration(VariableDeclaration* decl) {}
82 83
83 void VisitFunctionDeclaration(FunctionDeclaration* decl) { 84 void VisitFunctionDeclaration(FunctionDeclaration* decl) {
84 DCHECK_EQ(kModuleScope, scope_); 85 DCHECK_EQ(kModuleScope, scope_);
85 DCHECK_NULL(current_function_builder_); 86 DCHECK_NULL(current_function_builder_);
86 uint16_t index = LookupOrInsertFunction(decl->proxy()->var()); 87 uint32_t index = LookupOrInsertFunction(decl->proxy()->var());
87 current_function_builder_ = builder_->FunctionAt(index); 88 current_function_builder_ = builder_->FunctionAt(index);
88 scope_ = kFuncScope; 89 scope_ = kFuncScope;
89 RECURSE(Visit(decl->fun())); 90 RECURSE(Visit(decl->fun()));
90 scope_ = kModuleScope; 91 scope_ = kModuleScope;
91 current_function_builder_ = nullptr; 92 current_function_builder_ = nullptr;
92 local_variables_.Clear(); 93 local_variables_.Clear();
93 } 94 }
94 95
95 void VisitImportDeclaration(ImportDeclaration* decl) {} 96 void VisitImportDeclaration(ImportDeclaration* decl) {}
96 97
(...skipping 307 matching lines...) Expand 10 before | Expand all | Expand 10 after
404 void VisitTryCatchStatement(TryCatchStatement* stmt) { UNREACHABLE(); } 405 void VisitTryCatchStatement(TryCatchStatement* stmt) { UNREACHABLE(); }
405 406
406 void VisitTryFinallyStatement(TryFinallyStatement* stmt) { UNREACHABLE(); } 407 void VisitTryFinallyStatement(TryFinallyStatement* stmt) { UNREACHABLE(); }
407 408
408 void VisitDebuggerStatement(DebuggerStatement* stmt) { UNREACHABLE(); } 409 void VisitDebuggerStatement(DebuggerStatement* stmt) { UNREACHABLE(); }
409 410
410 void VisitFunctionLiteral(FunctionLiteral* expr) { 411 void VisitFunctionLiteral(FunctionLiteral* expr) {
411 Scope* scope = expr->scope(); 412 Scope* scope = expr->scope();
412 if (scope_ == kFuncScope) { 413 if (scope_ == kFuncScope) {
413 if (bounds_->get(expr).lower->IsFunction()) { 414 if (bounds_->get(expr).lower->IsFunction()) {
415 // Build the signature for the function.
414 FunctionType* func_type = bounds_->get(expr).lower->AsFunction(); 416 FunctionType* func_type = bounds_->get(expr).lower->AsFunction();
415 LocalType return_type = TypeFrom(func_type->Result()); 417 LocalType return_type = TypeFrom(func_type->Result());
416 current_function_builder_->ReturnType(return_type); 418 FunctionSig::Builder b(zone(), return_type == kAstStmt ? 0 : 1,
419 func_type->Arity());
420 if (return_type != kAstStmt) b.AddReturn(return_type);
417 for (int i = 0; i < expr->parameter_count(); i++) { 421 for (int i = 0; i < expr->parameter_count(); i++) {
418 LocalType type = TypeFrom(func_type->Parameter(i)); 422 LocalType type = TypeFrom(func_type->Parameter(i));
419 DCHECK_NE(kAstStmt, type); 423 DCHECK_NE(kAstStmt, type);
420 LookupOrInsertLocal(scope->parameter(i), type); 424 b.AddParam(type);
425 InsertParameter(scope->parameter(i), type, i);
421 } 426 }
427 current_function_builder_->SetSignature(b.Build());
422 } else { 428 } else {
423 UNREACHABLE(); 429 UNREACHABLE();
424 } 430 }
425 } 431 }
426 RECURSE(VisitStatements(expr->body())); 432 RECURSE(VisitStatements(expr->body()));
427 RECURSE(VisitDeclarations(scope->declarations())); 433 RECURSE(VisitDeclarations(scope->declarations()));
428 } 434 }
429 435
430 void VisitNativeFunctionLiteral(NativeFunctionLiteral* expr) { 436 void VisitNativeFunctionLiteral(NativeFunctionLiteral* expr) {
431 UNREACHABLE(); 437 UNREACHABLE();
(...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after
552 ObjectLiteralProperty* prop = props->at(i); 558 ObjectLiteralProperty* prop = props->at(i);
553 DCHECK_EQ(kExportScope, scope_); 559 DCHECK_EQ(kExportScope, scope_);
554 VariableProxy* expr = prop->value()->AsVariableProxy(); 560 VariableProxy* expr = prop->value()->AsVariableProxy();
555 DCHECK_NOT_NULL(expr); 561 DCHECK_NOT_NULL(expr);
556 Variable* var = expr->var(); 562 Variable* var = expr->var();
557 Literal* name = prop->key()->AsLiteral(); 563 Literal* name = prop->key()->AsLiteral();
558 DCHECK_NOT_NULL(name); 564 DCHECK_NOT_NULL(name);
559 DCHECK(name->IsPropertyName()); 565 DCHECK(name->IsPropertyName());
560 const AstRawString* raw_name = name->AsRawPropertyName(); 566 const AstRawString* raw_name = name->AsRawPropertyName();
561 if (var->is_function()) { 567 if (var->is_function()) {
562 uint16_t index = LookupOrInsertFunction(var); 568 uint32_t index = LookupOrInsertFunction(var);
563 builder_->FunctionAt(index)->Exported(1); 569 builder_->FunctionAt(index)->Exported(1);
564 builder_->FunctionAt(index)->SetName( 570 builder_->FunctionAt(index)->SetName(
565 reinterpret_cast<const char*>(raw_name->raw_data()), 571 reinterpret_cast<const char*>(raw_name->raw_data()),
566 raw_name->length()); 572 raw_name->length());
567 } 573 }
568 } 574 }
569 } 575 }
570 576
571 void VisitArrayLiteral(ArrayLiteral* expr) { UNREACHABLE(); } 577 void VisitArrayLiteral(ArrayLiteral* expr) { UNREACHABLE(); }
572 578
(...skipping 12 matching lines...) Expand all
585 bounds_->get(funcs).lower->AsArray()->Element()->AsFunction(); 591 bounds_->get(funcs).lower->AsArray()->Element()->AsFunction();
586 LocalType return_type = TypeFrom(func_type->Result()); 592 LocalType return_type = TypeFrom(func_type->Result());
587 FunctionSig::Builder sig(zone(), return_type == kAstStmt ? 0 : 1, 593 FunctionSig::Builder sig(zone(), return_type == kAstStmt ? 0 : 1,
588 func_type->Arity()); 594 func_type->Arity());
589 if (return_type != kAstStmt) { 595 if (return_type != kAstStmt) {
590 sig.AddReturn(static_cast<LocalType>(return_type)); 596 sig.AddReturn(static_cast<LocalType>(return_type));
591 } 597 }
592 for (int i = 0; i < func_type->Arity(); i++) { 598 for (int i = 0; i < func_type->Arity(); i++) {
593 sig.AddParam(TypeFrom(func_type->Parameter(i))); 599 sig.AddParam(TypeFrom(func_type->Parameter(i)));
594 } 600 }
595 uint16_t signature_index = builder_->AddSignature(sig.Build()); 601 uint32_t signature_index = builder_->AddSignature(sig.Build());
596 InsertFunctionTable(table->var(), next_table_index_, signature_index); 602 InsertFunctionTable(table->var(), next_table_index_, signature_index);
597 next_table_index_ += funcs->values()->length(); 603 next_table_index_ += funcs->values()->length();
598 for (int i = 0; i < funcs->values()->length(); i++) { 604 for (int i = 0; i < funcs->values()->length(); i++) {
599 VariableProxy* func = funcs->values()->at(i)->AsVariableProxy(); 605 VariableProxy* func = funcs->values()->at(i)->AsVariableProxy();
600 DCHECK_NOT_NULL(func); 606 DCHECK_NOT_NULL(func);
601 builder_->AddIndirectFunction(LookupOrInsertFunction(func->var())); 607 builder_->AddIndirectFunction(LookupOrInsertFunction(func->var()));
602 } 608 }
603 } 609 }
604 610
605 struct FunctionTableIndices : public ZoneObject { 611 struct FunctionTableIndices : public ZoneObject {
606 uint32_t start_index; 612 uint32_t start_index;
607 uint16_t signature_index; 613 uint32_t signature_index;
608 }; 614 };
609 615
610 void InsertFunctionTable(Variable* v, uint32_t start_index, 616 void InsertFunctionTable(Variable* v, uint32_t start_index,
611 uint16_t signature_index) { 617 uint32_t signature_index) {
612 FunctionTableIndices* container = new (zone()) FunctionTableIndices(); 618 FunctionTableIndices* container = new (zone()) FunctionTableIndices();
613 container->start_index = start_index; 619 container->start_index = start_index;
614 container->signature_index = signature_index; 620 container->signature_index = signature_index;
615 ZoneHashMap::Entry* entry = function_tables_.LookupOrInsert( 621 ZoneHashMap::Entry* entry = function_tables_.LookupOrInsert(
616 v, ComputePointerHash(v), ZoneAllocationPolicy(zone())); 622 v, ComputePointerHash(v), ZoneAllocationPolicy(zone()));
617 entry->value = container; 623 entry->value = container;
618 } 624 }
619 625
620 FunctionTableIndices* LookupFunctionTable(Variable* v) { 626 FunctionTableIndices* LookupFunctionTable(Variable* v) {
621 ZoneHashMap::Entry* entry = 627 ZoneHashMap::Entry* entry =
(...skipping 23 matching lines...) Expand all
645 builder_(builder) {} 651 builder_(builder) {}
646 652
647 void AddImport(Variable* v, const char* name, int name_length) { 653 void AddImport(Variable* v, const char* name, int name_length) {
648 ImportedFunctionIndices* indices = new (builder_->zone()) 654 ImportedFunctionIndices* indices = new (builder_->zone())
649 ImportedFunctionIndices(name, name_length, builder_->zone()); 655 ImportedFunctionIndices(name, name_length, builder_->zone());
650 ZoneHashMap::Entry* entry = table_.LookupOrInsert( 656 ZoneHashMap::Entry* entry = table_.LookupOrInsert(
651 v, ComputePointerHash(v), ZoneAllocationPolicy(builder_->zone())); 657 v, ComputePointerHash(v), ZoneAllocationPolicy(builder_->zone()));
652 entry->value = indices; 658 entry->value = indices;
653 } 659 }
654 660
655 uint16_t GetFunctionIndex(Variable* v, FunctionSig* sig) { 661 uint32_t GetFunctionIndex(Variable* v, FunctionSig* sig) {
656 ZoneHashMap::Entry* entry = table_.Lookup(v, ComputePointerHash(v)); 662 ZoneHashMap::Entry* entry = table_.Lookup(v, ComputePointerHash(v));
657 DCHECK_NOT_NULL(entry); 663 DCHECK_NOT_NULL(entry);
658 ImportedFunctionIndices* indices = 664 ImportedFunctionIndices* indices =
659 reinterpret_cast<ImportedFunctionIndices*>(entry->value); 665 reinterpret_cast<ImportedFunctionIndices*>(entry->value);
660 WasmModuleBuilder::SignatureMap::iterator pos = 666 WasmModuleBuilder::SignatureMap::iterator pos =
661 indices->signature_to_index_.find(sig); 667 indices->signature_to_index_.find(sig);
662 if (pos != indices->signature_to_index_.end()) { 668 if (pos != indices->signature_to_index_.end()) {
663 return pos->second; 669 return pos->second;
664 } else { 670 } else {
665 uint32_t index = builder_->builder_->AddImport( 671 uint32_t index = builder_->builder_->AddImport(
(...skipping 396 matching lines...) Expand 10 before | Expand all | Expand 10 after
1062 current_function_builder_->Emit(kExprF32Sqrt); 1068 current_function_builder_->Emit(kExprF32Sqrt);
1063 } else if (call_type == kAstF64) { 1069 } else if (call_type == kAstF64) {
1064 current_function_builder_->Emit(kExprF64Sqrt); 1070 current_function_builder_->Emit(kExprF64Sqrt);
1065 } else { 1071 } else {
1066 UNREACHABLE(); 1072 UNREACHABLE();
1067 } 1073 }
1068 break; 1074 break;
1069 } 1075 }
1070 case AsmTyper::kMathAbs: { 1076 case AsmTyper::kMathAbs: {
1071 if (call_type == kAstI32) { 1077 if (call_type == kAstI32) {
1072 uint16_t tmp = current_function_builder_->AddLocal(kAstI32); 1078 uint32_t tmp = current_function_builder_->AddLocal(kAstI32);
1073 1079
1074 // if set_local(tmp, x) < 0 1080 // if set_local(tmp, x) < 0
1075 Visit(call->arguments()->at(0)); 1081 Visit(call->arguments()->at(0));
1076 current_function_builder_->EmitSetLocal(tmp); 1082 current_function_builder_->EmitSetLocal(tmp);
1077 byte code[] = {WASM_I8(0)}; 1083 byte code[] = {WASM_I8(0)};
1078 current_function_builder_->EmitCode(code, sizeof(code)); 1084 current_function_builder_->EmitCode(code, sizeof(code));
1079 current_function_builder_->Emit(kExprI32LtS); 1085 current_function_builder_->Emit(kExprI32LtS);
1080 current_function_builder_->Emit(kExprIf); 1086 current_function_builder_->Emit(kExprIf);
1081 1087
1082 // then (0 - tmp) 1088 // then (0 - tmp)
(...skipping 14 matching lines...) Expand all
1097 VisitCallArgs(call); 1103 VisitCallArgs(call);
1098 current_function_builder_->Emit(kExprF64Abs); 1104 current_function_builder_->Emit(kExprF64Abs);
1099 } else { 1105 } else {
1100 UNREACHABLE(); 1106 UNREACHABLE();
1101 } 1107 }
1102 break; 1108 break;
1103 } 1109 }
1104 case AsmTyper::kMathMin: { 1110 case AsmTyper::kMathMin: {
1105 // TODO(bradnelson): Change wasm to match Math.min in asm.js mode. 1111 // TODO(bradnelson): Change wasm to match Math.min in asm.js mode.
1106 if (call_type == kAstI32) { 1112 if (call_type == kAstI32) {
1107 uint16_t tmp_x = current_function_builder_->AddLocal(kAstI32); 1113 uint32_t tmp_x = current_function_builder_->AddLocal(kAstI32);
1108 uint16_t tmp_y = current_function_builder_->AddLocal(kAstI32); 1114 uint32_t tmp_y = current_function_builder_->AddLocal(kAstI32);
1109 1115
1110 // if set_local(tmp_x, x) < set_local(tmp_y, y) 1116 // if set_local(tmp_x, x) < set_local(tmp_y, y)
1111 Visit(call->arguments()->at(0)); 1117 Visit(call->arguments()->at(0));
1112 current_function_builder_->EmitSetLocal(tmp_x); 1118 current_function_builder_->EmitSetLocal(tmp_x);
1113 1119
1114 Visit(call->arguments()->at(1)); 1120 Visit(call->arguments()->at(1));
1115 current_function_builder_->EmitSetLocal(tmp_y); 1121 current_function_builder_->EmitSetLocal(tmp_y);
1116 1122
1117 current_function_builder_->Emit(kExprI32LeS); 1123 current_function_builder_->Emit(kExprI32LeS);
1118 current_function_builder_->Emit(kExprIf); 1124 current_function_builder_->Emit(kExprIf);
(...skipping 13 matching lines...) Expand all
1132 VisitCallArgs(call); 1138 VisitCallArgs(call);
1133 current_function_builder_->Emit(kExprF64Min); 1139 current_function_builder_->Emit(kExprF64Min);
1134 } else { 1140 } else {
1135 UNREACHABLE(); 1141 UNREACHABLE();
1136 } 1142 }
1137 break; 1143 break;
1138 } 1144 }
1139 case AsmTyper::kMathMax: { 1145 case AsmTyper::kMathMax: {
1140 // TODO(bradnelson): Change wasm to match Math.max in asm.js mode. 1146 // TODO(bradnelson): Change wasm to match Math.max in asm.js mode.
1141 if (call_type == kAstI32) { 1147 if (call_type == kAstI32) {
1142 uint16_t tmp_x = current_function_builder_->AddLocal(kAstI32); 1148 uint32_t tmp_x = current_function_builder_->AddLocal(kAstI32);
1143 uint16_t tmp_y = current_function_builder_->AddLocal(kAstI32); 1149 uint32_t tmp_y = current_function_builder_->AddLocal(kAstI32);
1144 1150
1145 // if set_local(tmp_x, x) < set_local(tmp_y, y) 1151 // if set_local(tmp_x, x) < set_local(tmp_y, y)
1146 Visit(call->arguments()->at(0)); 1152 Visit(call->arguments()->at(0));
1147 1153
1148 current_function_builder_->EmitSetLocal(tmp_x); 1154 current_function_builder_->EmitSetLocal(tmp_x);
1149 1155
1150 Visit(call->arguments()->at(1)); 1156 Visit(call->arguments()->at(1));
1151 current_function_builder_->EmitSetLocal(tmp_y); 1157 current_function_builder_->EmitSetLocal(tmp_y);
1152 1158
1153 current_function_builder_->Emit(kExprI32LeS); 1159 current_function_builder_->Emit(kExprI32LeS);
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after
1240 Call::CallType call_type = expr->GetCallType(isolate_); 1246 Call::CallType call_type = expr->GetCallType(isolate_);
1241 switch (call_type) { 1247 switch (call_type) {
1242 case Call::OTHER_CALL: { 1248 case Call::OTHER_CALL: {
1243 DCHECK_EQ(kFuncScope, scope_); 1249 DCHECK_EQ(kFuncScope, scope_);
1244 VariableProxy* proxy = expr->expression()->AsVariableProxy(); 1250 VariableProxy* proxy = expr->expression()->AsVariableProxy();
1245 if (proxy != nullptr) { 1251 if (proxy != nullptr) {
1246 if (VisitStdlibFunction(expr, proxy)) { 1252 if (VisitStdlibFunction(expr, proxy)) {
1247 return; 1253 return;
1248 } 1254 }
1249 } 1255 }
1250 uint16_t index; 1256 uint32_t index;
1251 VariableProxy* vp = expr->expression()->AsVariableProxy(); 1257 VariableProxy* vp = expr->expression()->AsVariableProxy();
1252 if (vp != nullptr && 1258 if (vp != nullptr &&
1253 Type::Any()->Is(bounds_->get(vp).lower->AsFunction()->Result())) { 1259 Type::Any()->Is(bounds_->get(vp).lower->AsFunction()->Result())) {
1254 LocalType return_type = TypeOf(expr); 1260 LocalType return_type = TypeOf(expr);
1255 ZoneList<Expression*>* args = expr->arguments(); 1261 ZoneList<Expression*>* args = expr->arguments();
1256 FunctionSig::Builder sig(zone(), return_type == kAstStmt ? 0 : 1, 1262 FunctionSig::Builder sig(zone(), return_type == kAstStmt ? 0 : 1,
1257 args->length()); 1263 args->length());
1258 if (return_type != kAstStmt) { 1264 if (return_type != kAstStmt) {
1259 sig.AddReturn(return_type); 1265 sig.AddReturn(return_type);
1260 } 1266 }
(...skipping 360 matching lines...) Expand 10 before | Expand all | Expand 10 after
1621 1627
1622 void VisitSloppyBlockFunctionStatement(SloppyBlockFunctionStatement* expr) { 1628 void VisitSloppyBlockFunctionStatement(SloppyBlockFunctionStatement* expr) {
1623 UNREACHABLE(); 1629 UNREACHABLE();
1624 } 1630 }
1625 1631
1626 void VisitDoExpression(DoExpression* expr) { UNREACHABLE(); } 1632 void VisitDoExpression(DoExpression* expr) { UNREACHABLE(); }
1627 1633
1628 void VisitRewritableExpression(RewritableExpression* expr) { UNREACHABLE(); } 1634 void VisitRewritableExpression(RewritableExpression* expr) { UNREACHABLE(); }
1629 1635
1630 struct IndexContainer : public ZoneObject { 1636 struct IndexContainer : public ZoneObject {
1631 uint16_t index; 1637 uint32_t index;
1632 }; 1638 };
1633 1639
1634 uint16_t LookupOrInsertLocal(Variable* v, LocalType type) { 1640 uint32_t LookupOrInsertLocal(Variable* v, LocalType type) {
1635 DCHECK_NOT_NULL(current_function_builder_); 1641 DCHECK_NOT_NULL(current_function_builder_);
1636 ZoneHashMap::Entry* entry = 1642 ZoneHashMap::Entry* entry =
1637 local_variables_.Lookup(v, ComputePointerHash(v)); 1643 local_variables_.Lookup(v, ComputePointerHash(v));
1638 if (entry == nullptr) { 1644 if (entry == nullptr) {
1639 uint16_t index; 1645 uint32_t index;
1640 if (v->IsParameter()) { 1646 DCHECK(!v->IsParameter());
1641 index = current_function_builder_->AddParam(type); 1647 index = current_function_builder_->AddLocal(type);
1642 } else {
1643 index = current_function_builder_->AddLocal(type);
1644 }
1645 IndexContainer* container = new (zone()) IndexContainer(); 1648 IndexContainer* container = new (zone()) IndexContainer();
1646 container->index = index; 1649 container->index = index;
1647 entry = local_variables_.LookupOrInsert(v, ComputePointerHash(v), 1650 entry = local_variables_.LookupOrInsert(v, ComputePointerHash(v),
1648 ZoneAllocationPolicy(zone())); 1651 ZoneAllocationPolicy(zone()));
1649 entry->value = container; 1652 entry->value = container;
1650 } 1653 }
1651 return (reinterpret_cast<IndexContainer*>(entry->value))->index; 1654 return (reinterpret_cast<IndexContainer*>(entry->value))->index;
1652 } 1655 }
1653 1656
1654 uint16_t LookupOrInsertGlobal(Variable* v, LocalType type) { 1657 void InsertParameter(Variable* v, LocalType type, uint32_t index) {
1658 DCHECK(v->IsParameter());
1659 DCHECK_NOT_NULL(current_function_builder_);
1660 ZoneHashMap::Entry* entry =
1661 local_variables_.Lookup(v, ComputePointerHash(v));
1662 DCHECK_NULL(entry);
1663 IndexContainer* container = new (zone()) IndexContainer();
1664 container->index = index;
1665 entry = local_variables_.LookupOrInsert(v, ComputePointerHash(v),
1666 ZoneAllocationPolicy(zone()));
1667 entry->value = container;
1668 }
1669
1670 uint32_t LookupOrInsertGlobal(Variable* v, LocalType type) {
1655 ZoneHashMap::Entry* entry = 1671 ZoneHashMap::Entry* entry =
1656 global_variables_.Lookup(v, ComputePointerHash(v)); 1672 global_variables_.Lookup(v, ComputePointerHash(v));
1657 if (entry == nullptr) { 1673 if (entry == nullptr) {
1658 uint16_t index = 1674 uint32_t index =
1659 builder_->AddGlobal(WasmOpcodes::MachineTypeFor(type), 0); 1675 builder_->AddGlobal(WasmOpcodes::MachineTypeFor(type), 0);
1660 IndexContainer* container = new (zone()) IndexContainer(); 1676 IndexContainer* container = new (zone()) IndexContainer();
1661 container->index = index; 1677 container->index = index;
1662 entry = global_variables_.LookupOrInsert(v, ComputePointerHash(v), 1678 entry = global_variables_.LookupOrInsert(v, ComputePointerHash(v),
1663 ZoneAllocationPolicy(zone())); 1679 ZoneAllocationPolicy(zone()));
1664 entry->value = container; 1680 entry->value = container;
1665 } 1681 }
1666 return (reinterpret_cast<IndexContainer*>(entry->value))->index; 1682 return (reinterpret_cast<IndexContainer*>(entry->value))->index;
1667 } 1683 }
1668 1684
1669 uint16_t LookupOrInsertFunction(Variable* v) { 1685 uint32_t LookupOrInsertFunction(Variable* v) {
1670 DCHECK_NOT_NULL(builder_); 1686 DCHECK_NOT_NULL(builder_);
1671 ZoneHashMap::Entry* entry = functions_.Lookup(v, ComputePointerHash(v)); 1687 ZoneHashMap::Entry* entry = functions_.Lookup(v, ComputePointerHash(v));
1672 if (entry == nullptr) { 1688 if (entry == nullptr) {
1673 uint16_t index = builder_->AddFunction(); 1689 uint32_t index = builder_->AddFunction();
1674 IndexContainer* container = new (zone()) IndexContainer(); 1690 IndexContainer* container = new (zone()) IndexContainer();
1675 container->index = index; 1691 container->index = index;
1676 entry = functions_.LookupOrInsert(v, ComputePointerHash(v), 1692 entry = functions_.LookupOrInsert(v, ComputePointerHash(v),
1677 ZoneAllocationPolicy(zone())); 1693 ZoneAllocationPolicy(zone()));
1678 entry->value = container; 1694 entry->value = container;
1679 } 1695 }
1680 return (reinterpret_cast<IndexContainer*>(entry->value))->index; 1696 return (reinterpret_cast<IndexContainer*>(entry->value))->index;
1681 } 1697 }
1682 1698
1683 LocalType TypeOf(Expression* expr) { 1699 LocalType TypeOf(Expression* expr) {
(...skipping 21 matching lines...) Expand all
1705 AsmScope scope_; 1721 AsmScope scope_;
1706 WasmModuleBuilder* builder_; 1722 WasmModuleBuilder* builder_;
1707 WasmFunctionBuilder* current_function_builder_; 1723 WasmFunctionBuilder* current_function_builder_;
1708 FunctionLiteral* literal_; 1724 FunctionLiteral* literal_;
1709 Isolate* isolate_; 1725 Isolate* isolate_;
1710 Zone* zone_; 1726 Zone* zone_;
1711 Handle<Object> foreign_; 1727 Handle<Object> foreign_;
1712 AsmTyper* typer_; 1728 AsmTyper* typer_;
1713 TypeCache const& cache_; 1729 TypeCache const& cache_;
1714 ZoneVector<std::pair<BreakableStatement*, bool>> breakable_blocks_; 1730 ZoneVector<std::pair<BreakableStatement*, bool>> breakable_blocks_;
1715 uint16_t init_function_index_; 1731 uint32_t init_function_index_;
1716 uint32_t next_table_index_; 1732 uint32_t next_table_index_;
1717 ZoneHashMap function_tables_; 1733 ZoneHashMap function_tables_;
1718 ImportedFunctionTable imported_function_table_; 1734 ImportedFunctionTable imported_function_table_;
1719 const AstTypeBounds* bounds_; 1735 const AstTypeBounds* bounds_;
1720 1736
1721 DEFINE_AST_VISITOR_SUBCLASS_MEMBERS(); 1737 DEFINE_AST_VISITOR_SUBCLASS_MEMBERS();
1722 1738
1723 private: 1739 private:
1724 DISALLOW_COPY_AND_ASSIGN(AsmWasmBuilderImpl); 1740 DISALLOW_COPY_AND_ASSIGN(AsmWasmBuilderImpl);
1725 }; 1741 };
(...skipping 11 matching lines...) Expand all
1737 // that zone in constructor may be thrown away once wasm module is written. 1753 // that zone in constructor may be thrown away once wasm module is written.
1738 WasmModuleIndex* AsmWasmBuilder::Run() { 1754 WasmModuleIndex* AsmWasmBuilder::Run() {
1739 AsmWasmBuilderImpl impl(isolate_, zone_, literal_, foreign_, typer_); 1755 AsmWasmBuilderImpl impl(isolate_, zone_, literal_, foreign_, typer_);
1740 impl.Compile(); 1756 impl.Compile();
1741 WasmModuleWriter* writer = impl.builder_->Build(zone_); 1757 WasmModuleWriter* writer = impl.builder_->Build(zone_);
1742 return writer->WriteTo(zone_); 1758 return writer->WriteTo(zone_);
1743 } 1759 }
1744 } // namespace wasm 1760 } // namespace wasm
1745 } // namespace internal 1761 } // namespace internal
1746 } // namespace v8 1762 } // 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