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/zone-containers.h" | 9 #include "src/zone/zone-containers.h" |
10 | 10 |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
69 body_.push_back(*p); | 69 body_.push_back(*p); |
70 } | 70 } |
71 } | 71 } |
72 | 72 |
73 void WasmFunctionBuilder::SetSignature(FunctionSig* sig) { | 73 void WasmFunctionBuilder::SetSignature(FunctionSig* sig) { |
74 DCHECK(!locals_.has_sig()); | 74 DCHECK(!locals_.has_sig()); |
75 locals_.set_sig(sig); | 75 locals_.set_sig(sig); |
76 signature_index_ = builder_->AddSignature(sig); | 76 signature_index_ = builder_->AddSignature(sig); |
77 } | 77 } |
78 | 78 |
79 uint32_t WasmFunctionBuilder::AddLocal(LocalType type) { | 79 uint32_t WasmFunctionBuilder::AddLocal(ValueType type) { |
80 DCHECK(locals_.has_sig()); | 80 DCHECK(locals_.has_sig()); |
81 return locals_.AddLocals(1, type); | 81 return locals_.AddLocals(1, type); |
82 } | 82 } |
83 | 83 |
84 void WasmFunctionBuilder::EmitGetLocal(uint32_t local_index) { | 84 void WasmFunctionBuilder::EmitGetLocal(uint32_t local_index) { |
85 EmitWithVarInt(kExprGetLocal, local_index); | 85 EmitWithVarInt(kExprGetLocal, local_index); |
86 } | 86 } |
87 | 87 |
88 void WasmFunctionBuilder::EmitSetLocal(uint32_t local_index) { | 88 void WasmFunctionBuilder::EmitSetLocal(uint32_t local_index) { |
89 EmitWithVarInt(kExprSetLocal, local_index); | 89 EmitWithVarInt(kExprSetLocal, local_index); |
(...skipping 192 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
282 uint32_t WasmModuleBuilder::AddImport(const char* name, int name_length, | 282 uint32_t WasmModuleBuilder::AddImport(const char* name, int name_length, |
283 FunctionSig* sig) { | 283 FunctionSig* sig) { |
284 imports_.push_back({AddSignature(sig), name, name_length}); | 284 imports_.push_back({AddSignature(sig), name, name_length}); |
285 return static_cast<uint32_t>(imports_.size() - 1); | 285 return static_cast<uint32_t>(imports_.size() - 1); |
286 } | 286 } |
287 | 287 |
288 void WasmModuleBuilder::MarkStartFunction(WasmFunctionBuilder* function) { | 288 void WasmModuleBuilder::MarkStartFunction(WasmFunctionBuilder* function) { |
289 start_function_index_ = function->func_index(); | 289 start_function_index_ = function->func_index(); |
290 } | 290 } |
291 | 291 |
292 uint32_t WasmModuleBuilder::AddGlobal(LocalType type, bool exported, | 292 uint32_t WasmModuleBuilder::AddGlobal(ValueType type, bool exported, |
293 bool mutability, | 293 bool mutability, |
294 const WasmInitExpr& init) { | 294 const WasmInitExpr& init) { |
295 globals_.push_back({type, exported, mutability, init}); | 295 globals_.push_back({type, exported, mutability, init}); |
296 return static_cast<uint32_t>(globals_.size() - 1); | 296 return static_cast<uint32_t>(globals_.size() - 1); |
297 } | 297 } |
298 | 298 |
299 void WasmModuleBuilder::WriteTo(ZoneBuffer& buffer) const { | 299 void WasmModuleBuilder::WriteTo(ZoneBuffer& buffer) const { |
300 uint32_t exports = 0; | 300 uint32_t exports = 0; |
301 | 301 |
302 // == Emit magic ============================================================= | 302 // == Emit magic ============================================================= |
303 TRACE("emit magic\n"); | 303 TRACE("emit magic\n"); |
304 buffer.write_u32(kWasmMagic); | 304 buffer.write_u32(kWasmMagic); |
305 buffer.write_u32(kWasmVersion); | 305 buffer.write_u32(kWasmVersion); |
306 | 306 |
307 // == Emit signatures ======================================================== | 307 // == Emit signatures ======================================================== |
308 if (signatures_.size() > 0) { | 308 if (signatures_.size() > 0) { |
309 size_t start = EmitSection(kTypeSectionCode, buffer); | 309 size_t start = EmitSection(kTypeSectionCode, buffer); |
310 buffer.write_size(signatures_.size()); | 310 buffer.write_size(signatures_.size()); |
311 | 311 |
312 for (FunctionSig* sig : signatures_) { | 312 for (FunctionSig* sig : signatures_) { |
313 buffer.write_u8(kWasmFunctionTypeForm); | 313 buffer.write_u8(kWasmFunctionTypeForm); |
314 buffer.write_size(sig->parameter_count()); | 314 buffer.write_size(sig->parameter_count()); |
315 for (size_t j = 0; j < sig->parameter_count(); j++) { | 315 for (size_t j = 0; j < sig->parameter_count(); j++) { |
316 buffer.write_u8(WasmOpcodes::LocalTypeCodeFor(sig->GetParam(j))); | 316 buffer.write_u8(WasmOpcodes::ValueTypeCodeFor(sig->GetParam(j))); |
317 } | 317 } |
318 buffer.write_size(sig->return_count()); | 318 buffer.write_size(sig->return_count()); |
319 for (size_t j = 0; j < sig->return_count(); j++) { | 319 for (size_t j = 0; j < sig->return_count(); j++) { |
320 buffer.write_u8(WasmOpcodes::LocalTypeCodeFor(sig->GetReturn(j))); | 320 buffer.write_u8(WasmOpcodes::ValueTypeCodeFor(sig->GetReturn(j))); |
321 } | 321 } |
322 } | 322 } |
323 FixupSection(buffer, start); | 323 FixupSection(buffer, start); |
324 } | 324 } |
325 | 325 |
326 // == Emit imports =========================================================== | 326 // == Emit imports =========================================================== |
327 if (imports_.size() > 0) { | 327 if (imports_.size() > 0) { |
328 size_t start = EmitSection(kImportSectionCode, buffer); | 328 size_t start = EmitSection(kImportSectionCode, buffer); |
329 buffer.write_size(imports_.size()); | 329 buffer.write_size(imports_.size()); |
330 for (auto import : imports_) { | 330 for (auto import : imports_) { |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
371 buffer.write_u32v(32); // max memory size | 371 buffer.write_u32v(32); // max memory size |
372 FixupSection(buffer, start); | 372 FixupSection(buffer, start); |
373 } | 373 } |
374 | 374 |
375 // == Emit globals =========================================================== | 375 // == Emit globals =========================================================== |
376 if (globals_.size() > 0) { | 376 if (globals_.size() > 0) { |
377 size_t start = EmitSection(kGlobalSectionCode, buffer); | 377 size_t start = EmitSection(kGlobalSectionCode, buffer); |
378 buffer.write_size(globals_.size()); | 378 buffer.write_size(globals_.size()); |
379 | 379 |
380 for (auto global : globals_) { | 380 for (auto global : globals_) { |
381 buffer.write_u8(WasmOpcodes::LocalTypeCodeFor(global.type)); | 381 buffer.write_u8(WasmOpcodes::ValueTypeCodeFor(global.type)); |
382 buffer.write_u8(global.mutability ? 1 : 0); | 382 buffer.write_u8(global.mutability ? 1 : 0); |
383 switch (global.init.kind) { | 383 switch (global.init.kind) { |
384 case WasmInitExpr::kI32Const: { | 384 case WasmInitExpr::kI32Const: { |
385 DCHECK_EQ(kAstI32, global.type); | 385 DCHECK_EQ(kWasmI32, global.type); |
386 const byte code[] = {WASM_I32V_5(global.init.val.i32_const)}; | 386 const byte code[] = {WASM_I32V_5(global.init.val.i32_const)}; |
387 buffer.write(code, sizeof(code)); | 387 buffer.write(code, sizeof(code)); |
388 break; | 388 break; |
389 } | 389 } |
390 case WasmInitExpr::kI64Const: { | 390 case WasmInitExpr::kI64Const: { |
391 DCHECK_EQ(kAstI64, global.type); | 391 DCHECK_EQ(kWasmI64, global.type); |
392 const byte code[] = {WASM_I64V_10(global.init.val.i64_const)}; | 392 const byte code[] = {WASM_I64V_10(global.init.val.i64_const)}; |
393 buffer.write(code, sizeof(code)); | 393 buffer.write(code, sizeof(code)); |
394 break; | 394 break; |
395 } | 395 } |
396 case WasmInitExpr::kF32Const: { | 396 case WasmInitExpr::kF32Const: { |
397 DCHECK_EQ(kAstF32, global.type); | 397 DCHECK_EQ(kWasmF32, global.type); |
398 const byte code[] = {WASM_F32(global.init.val.f32_const)}; | 398 const byte code[] = {WASM_F32(global.init.val.f32_const)}; |
399 buffer.write(code, sizeof(code)); | 399 buffer.write(code, sizeof(code)); |
400 break; | 400 break; |
401 } | 401 } |
402 case WasmInitExpr::kF64Const: { | 402 case WasmInitExpr::kF64Const: { |
403 DCHECK_EQ(kAstF64, global.type); | 403 DCHECK_EQ(kWasmF64, global.type); |
404 const byte code[] = {WASM_F64(global.init.val.f64_const)}; | 404 const byte code[] = {WASM_F64(global.init.val.f64_const)}; |
405 buffer.write(code, sizeof(code)); | 405 buffer.write(code, sizeof(code)); |
406 break; | 406 break; |
407 } | 407 } |
408 case WasmInitExpr::kGlobalIndex: { | 408 case WasmInitExpr::kGlobalIndex: { |
409 const byte code[] = {kExprGetGlobal, | 409 const byte code[] = {kExprGetGlobal, |
410 U32V_5(global.init.val.global_index)}; | 410 U32V_5(global.init.val.global_index)}; |
411 buffer.write(code, sizeof(code)); | 411 buffer.write(code, sizeof(code)); |
412 break; | 412 break; |
413 } | 413 } |
414 default: { | 414 default: { |
415 // No initializer, emit a default value. | 415 // No initializer, emit a default value. |
416 switch (global.type) { | 416 switch (global.type) { |
417 case kAstI32: { | 417 case kWasmI32: { |
418 const byte code[] = {WASM_I32V_1(0)}; | 418 const byte code[] = {WASM_I32V_1(0)}; |
419 buffer.write(code, sizeof(code)); | 419 buffer.write(code, sizeof(code)); |
420 break; | 420 break; |
421 } | 421 } |
422 case kAstI64: { | 422 case kWasmI64: { |
423 const byte code[] = {WASM_I64V_1(0)}; | 423 const byte code[] = {WASM_I64V_1(0)}; |
424 buffer.write(code, sizeof(code)); | 424 buffer.write(code, sizeof(code)); |
425 break; | 425 break; |
426 } | 426 } |
427 case kAstF32: { | 427 case kWasmF32: { |
428 const byte code[] = {WASM_F32(0.0)}; | 428 const byte code[] = {WASM_F32(0.0)}; |
429 buffer.write(code, sizeof(code)); | 429 buffer.write(code, sizeof(code)); |
430 break; | 430 break; |
431 } | 431 } |
432 case kAstF64: { | 432 case kWasmF64: { |
433 const byte code[] = {WASM_F64(0.0)}; | 433 const byte code[] = {WASM_F64(0.0)}; |
434 buffer.write(code, sizeof(code)); | 434 buffer.write(code, sizeof(code)); |
435 break; | 435 break; |
436 } | 436 } |
437 default: | 437 default: |
438 UNREACHABLE(); | 438 UNREACHABLE(); |
439 } | 439 } |
440 } | 440 } |
441 } | 441 } |
442 buffer.write_u8(kExprEnd); | 442 buffer.write_u8(kExprEnd); |
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
535 // Emit the offset table per function. | 535 // Emit the offset table per function. |
536 for (auto function : functions_) { | 536 for (auto function : functions_) { |
537 function->WriteAsmWasmOffsetTable(buffer); | 537 function->WriteAsmWasmOffsetTable(buffer); |
538 } | 538 } |
539 // Append a 0 to indicate that this is an encoded table. | 539 // Append a 0 to indicate that this is an encoded table. |
540 buffer.write_u8(0); | 540 buffer.write_u8(0); |
541 } | 541 } |
542 } // namespace wasm | 542 } // namespace wasm |
543 } // namespace internal | 543 } // namespace internal |
544 } // namespace v8 | 544 } // namespace v8 |
OLD | NEW |