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 #include "src/signature.h" | 5 #include "src/signature.h" |
6 | 6 |
7 #include "src/handles.h" | 7 #include "src/handles.h" |
8 #include "src/v8.h" | 8 #include "src/v8.h" |
9 #include "src/zone-containers.h" | 9 #include "src/zone-containers.h" |
10 | 10 |
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
73 val = next; | 73 val = next; |
74 } else { | 74 } else { |
75 *(start++) = out; | 75 *(start++) = out; |
76 // TODO(jfb) check that the pre-allocated fixup size isn't overflowed. | 76 // TODO(jfb) check that the pre-allocated fixup size isn't overflowed. |
77 } | 77 } |
78 } | 78 } |
79 } | 79 } |
80 | 80 |
81 // Returns the start of the section, where the section VarInt size is. | 81 // Returns the start of the section, where the section VarInt size is. |
82 byte* EmitSection(WasmSection::Code code, byte** b) { | 82 byte* EmitSection(WasmSection::Code code, byte** b) { |
83 // Emit a placeholder for the length. | |
84 byte* start = *b; | |
85 for (size_t padding = 0; padding != kPaddedVarintSize; ++padding) { | |
86 EmitUint8(b, 0xff); // Will get fixed up later. | |
87 } | |
88 // Emit the section name. | 83 // Emit the section name. |
89 const char* name = WasmSection::getName(code); | 84 const char* name = WasmSection::getName(code); |
90 TRACE("emit section: %s\n", name); | 85 TRACE("emit section: %s\n", name); |
91 size_t length = WasmSection::getNameLength(code); | 86 size_t length = WasmSection::getNameLength(code); |
92 EmitVarInt(b, length); // Section name string size. | 87 EmitVarInt(b, length); // Section name string size. |
93 for (size_t i = 0; i != length; ++i) EmitUint8(b, name[i]); | 88 for (size_t i = 0; i != length; ++i) EmitUint8(b, name[i]); |
94 | 89 |
| 90 // Emit a placeholder for the length. |
| 91 byte* start = *b; |
| 92 for (size_t padding = 0; padding != kPaddedVarintSize; ++padding) { |
| 93 EmitUint8(b, 0xff); // Will get fixed up later. |
| 94 } |
| 95 |
95 return start; | 96 return start; |
96 } | 97 } |
97 } // namespace | 98 } // namespace |
98 | 99 |
99 struct WasmFunctionBuilder::Type { | 100 struct WasmFunctionBuilder::Type { |
100 bool param_; | 101 bool param_; |
101 LocalType type_; | 102 LocalType type_; |
102 }; | 103 }; |
103 | 104 |
104 | 105 |
(...skipping 474 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
579 /* These globals never have names, so are always 3 bytes. */ | 580 /* These globals never have names, so are always 3 bytes. */ |
580 sizes.Add(3 * globals_.size(), 0); | 581 sizes.Add(3 * globals_.size(), 0); |
581 TRACE("Size after globals: %u, %u\n", (unsigned)sizes.header_size, | 582 TRACE("Size after globals: %u, %u\n", (unsigned)sizes.header_size, |
582 (unsigned)sizes.body_size); | 583 (unsigned)sizes.body_size); |
583 } | 584 } |
584 | 585 |
585 if (signatures_.size() > 0) { | 586 if (signatures_.size() > 0) { |
586 sizes.AddSection(WasmSection::Code::Signatures, signatures_.size()); | 587 sizes.AddSection(WasmSection::Code::Signatures, signatures_.size()); |
587 for (auto sig : signatures_) { | 588 for (auto sig : signatures_) { |
588 sizes.Add(1 + LEBHelper::sizeof_u32v(sig->parameter_count()) + | 589 sizes.Add(1 + LEBHelper::sizeof_u32v(sig->parameter_count()) + |
589 sig->parameter_count(), | 590 sig->parameter_count() + |
| 591 LEBHelper::sizeof_u32v(sig->return_count()) + |
| 592 sig->return_count(), |
590 0); | 593 0); |
591 } | 594 } |
592 TRACE("Size after signatures: %u, %u\n", (unsigned)sizes.header_size, | 595 TRACE("Size after signatures: %u, %u\n", (unsigned)sizes.header_size, |
593 (unsigned)sizes.body_size); | 596 (unsigned)sizes.body_size); |
594 } | 597 } |
595 | 598 |
596 if (functions_.size() > 0) { | 599 if (functions_.size() > 0) { |
597 sizes.AddSection(WasmSection::Code::Functions, functions_.size()); | 600 sizes.AddSection(WasmSection::Code::OldFunctions, functions_.size()); |
598 for (auto function : functions_) { | 601 for (auto function : functions_) { |
599 sizes.Add(function->HeaderSize() + function->BodySize(), | 602 sizes.Add(function->HeaderSize() + function->BodySize(), |
600 function->NameSize()); | 603 function->NameSize()); |
601 } | 604 } |
602 TRACE("Size after functions: %u, %u\n", (unsigned)sizes.header_size, | 605 TRACE("Size after functions: %u, %u\n", (unsigned)sizes.header_size, |
603 (unsigned)sizes.body_size); | 606 (unsigned)sizes.body_size); |
604 } | 607 } |
605 | 608 |
606 if (indirect_functions_.size() > 0) { | 609 if (indirect_functions_.size() > 0) { |
607 sizes.AddSection(WasmSection::Code::FunctionTable, | 610 sizes.AddSection(WasmSection::Code::FunctionTable, |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
662 } | 665 } |
663 FixupSection(section, header); | 666 FixupSection(section, header); |
664 } | 667 } |
665 | 668 |
666 // -- emit signatures -------------------------------------------------------- | 669 // -- emit signatures -------------------------------------------------------- |
667 if (signatures_.size() > 0) { | 670 if (signatures_.size() > 0) { |
668 byte* section = EmitSection(WasmSection::Code::Signatures, &header); | 671 byte* section = EmitSection(WasmSection::Code::Signatures, &header); |
669 EmitVarInt(&header, signatures_.size()); | 672 EmitVarInt(&header, signatures_.size()); |
670 | 673 |
671 for (FunctionSig* sig : signatures_) { | 674 for (FunctionSig* sig : signatures_) { |
| 675 EmitUint8(&header, kWasmFunctionTypeForm); |
672 EmitVarInt(&header, sig->parameter_count()); | 676 EmitVarInt(&header, sig->parameter_count()); |
673 if (sig->return_count() > 0) { | |
674 EmitUint8(&header, WasmOpcodes::LocalTypeCodeFor(sig->GetReturn())); | |
675 } else { | |
676 EmitUint8(&header, kLocalVoid); | |
677 } | |
678 for (size_t j = 0; j < sig->parameter_count(); j++) { | 677 for (size_t j = 0; j < sig->parameter_count(); j++) { |
679 EmitUint8(&header, WasmOpcodes::LocalTypeCodeFor(sig->GetParam(j))); | 678 EmitUint8(&header, WasmOpcodes::LocalTypeCodeFor(sig->GetParam(j))); |
680 } | 679 } |
| 680 EmitVarInt(&header, sig->return_count()); |
| 681 for (size_t j = 0; j < sig->return_count(); j++) { |
| 682 EmitUint8(&header, WasmOpcodes::LocalTypeCodeFor(sig->GetReturn(j))); |
| 683 } |
681 } | 684 } |
682 FixupSection(section, header); | 685 FixupSection(section, header); |
683 } | 686 } |
684 | 687 |
685 // -- emit functions --------------------------------------------------------- | 688 // -- emit functions --------------------------------------------------------- |
686 if (functions_.size() > 0) { | 689 if (functions_.size() > 0) { |
687 byte* section = EmitSection(WasmSection::Code::Functions, &header); | 690 byte* section = EmitSection(WasmSection::Code::OldFunctions, &header); |
688 EmitVarInt(&header, functions_.size()); | 691 EmitVarInt(&header, functions_.size()); |
689 | 692 |
690 for (auto func : functions_) { | 693 for (auto func : functions_) { |
691 func->Serialize(buffer, &header, &body); | 694 func->Serialize(buffer, &header, &body); |
692 } | 695 } |
693 FixupSection(section, header); | 696 FixupSection(section, header); |
694 } | 697 } |
695 | 698 |
696 // -- emit function table ---------------------------------------------------- | 699 // -- emit function table ---------------------------------------------------- |
697 if (indirect_functions_.size() > 0) { | 700 if (indirect_functions_.size() > 0) { |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
735 if (sizes.body_size > 0) { | 738 if (sizes.body_size > 0) { |
736 byte* section = EmitSection(WasmSection::Code::End, &header); | 739 byte* section = EmitSection(WasmSection::Code::End, &header); |
737 FixupSection(section, header); | 740 FixupSection(section, header); |
738 } | 741 } |
739 | 742 |
740 return new (zone) WasmModuleIndex(buffer, buffer + sizes.total()); | 743 return new (zone) WasmModuleIndex(buffer, buffer + sizes.total()); |
741 } | 744 } |
742 } // namespace wasm | 745 } // namespace wasm |
743 } // namespace internal | 746 } // namespace internal |
744 } // namespace v8 | 747 } // namespace v8 |
OLD | NEW |