| OLD | NEW |
| 1 // Copyright 2016 the V8 project authors. All rights reserved. | 1 // Copyright 2016 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 <stddef.h> | 5 #include <stddef.h> |
| 6 #include <stdint.h> | 6 #include <stdint.h> |
| 7 | 7 |
| 8 #include "include/v8.h" | 8 #include "include/v8.h" |
| 9 #include "src/isolate.h" | 9 #include "src/isolate.h" |
| 10 #include "src/objects.h" | 10 #include "src/objects.h" |
| (...skipping 17 matching lines...) Expand all Loading... |
| 28 // that a value of type V can be read without problems. | 28 // that a value of type V can be read without problems. |
| 29 *ok &= (*size > sizeof(V)); | 29 *ok &= (*size > sizeof(V)); |
| 30 if (!(*ok)) return 0; | 30 if (!(*ok)) return 0; |
| 31 V result = v8::internal::ReadLittleEndianValue<V>(*data); | 31 V result = v8::internal::ReadLittleEndianValue<V>(*data); |
| 32 *data += sizeof(V); | 32 *data += sizeof(V); |
| 33 *size -= sizeof(V); | 33 *size -= sizeof(V); |
| 34 return result; | 34 return result; |
| 35 } | 35 } |
| 36 | 36 |
| 37 static void add_argument( | 37 static void add_argument( |
| 38 v8::internal::Isolate* isolate, LocalType type, WasmVal* interpreter_args, | 38 v8::internal::Isolate* isolate, ValueType type, WasmVal* interpreter_args, |
| 39 v8::internal::Handle<v8::internal::Object>* compiled_args, int* argc, | 39 v8::internal::Handle<v8::internal::Object>* compiled_args, int* argc, |
| 40 const uint8_t** data, size_t* size, bool* ok) { | 40 const uint8_t** data, size_t* size, bool* ok) { |
| 41 if (!(*ok)) return; | 41 if (!(*ok)) return; |
| 42 switch (type) { | 42 switch (type) { |
| 43 case kAstF32: { | 43 case kWasmF32: { |
| 44 float value = read_value<float>(data, size, ok); | 44 float value = read_value<float>(data, size, ok); |
| 45 interpreter_args[*argc] = WasmVal(value); | 45 interpreter_args[*argc] = WasmVal(value); |
| 46 compiled_args[*argc] = | 46 compiled_args[*argc] = |
| 47 isolate->factory()->NewNumber(static_cast<double>(value)); | 47 isolate->factory()->NewNumber(static_cast<double>(value)); |
| 48 break; | 48 break; |
| 49 } | 49 } |
| 50 case kAstF64: { | 50 case kWasmF64: { |
| 51 double value = read_value<double>(data, size, ok); | 51 double value = read_value<double>(data, size, ok); |
| 52 interpreter_args[*argc] = WasmVal(value); | 52 interpreter_args[*argc] = WasmVal(value); |
| 53 compiled_args[*argc] = isolate->factory()->NewNumber(value); | 53 compiled_args[*argc] = isolate->factory()->NewNumber(value); |
| 54 break; | 54 break; |
| 55 } | 55 } |
| 56 case kAstI32: { | 56 case kWasmI32: { |
| 57 int32_t value = read_value<int32_t>(data, size, ok); | 57 int32_t value = read_value<int32_t>(data, size, ok); |
| 58 interpreter_args[*argc] = WasmVal(value); | 58 interpreter_args[*argc] = WasmVal(value); |
| 59 compiled_args[*argc] = | 59 compiled_args[*argc] = |
| 60 isolate->factory()->NewNumber(static_cast<double>(value)); | 60 isolate->factory()->NewNumber(static_cast<double>(value)); |
| 61 break; | 61 break; |
| 62 } | 62 } |
| 63 default: | 63 default: |
| 64 UNREACHABLE(); | 64 UNREACHABLE(); |
| 65 } | 65 } |
| 66 (*argc)++; | 66 (*argc)++; |
| (...skipping 15 matching lines...) Expand all Loading... |
| 82 v8::Context::Scope context_scope(support->GetContext()); | 82 v8::Context::Scope context_scope(support->GetContext()); |
| 83 v8::TryCatch try_catch(isolate); | 83 v8::TryCatch try_catch(isolate); |
| 84 | 84 |
| 85 v8::internal::AccountingAllocator allocator; | 85 v8::internal::AccountingAllocator allocator; |
| 86 v8::internal::Zone zone(&allocator, ZONE_NAME); | 86 v8::internal::Zone zone(&allocator, ZONE_NAME); |
| 87 | 87 |
| 88 bool ok = true; | 88 bool ok = true; |
| 89 uint8_t num_functions = | 89 uint8_t num_functions = |
| 90 (read_value<uint8_t>(&data, &size, &ok) % MAX_NUM_FUNCTIONS) + 1; | 90 (read_value<uint8_t>(&data, &size, &ok) % MAX_NUM_FUNCTIONS) + 1; |
| 91 | 91 |
| 92 LocalType types[] = {kAstF32, kAstF64, kAstI32, kAstI64}; | 92 ValueType types[] = {kWasmF32, kWasmF64, kWasmI32, kWasmI64}; |
| 93 WasmVal interpreter_args[3]; | 93 WasmVal interpreter_args[3]; |
| 94 v8::internal::Handle<v8::internal::Object> compiled_args[3]; | 94 v8::internal::Handle<v8::internal::Object> compiled_args[3]; |
| 95 int argc = 0; | 95 int argc = 0; |
| 96 | 96 |
| 97 WasmModuleBuilder builder(&zone); | 97 WasmModuleBuilder builder(&zone); |
| 98 for (int fun = 0; fun < num_functions; fun++) { | 98 for (int fun = 0; fun < num_functions; fun++) { |
| 99 size_t num_params = static_cast<size_t>( | 99 size_t num_params = static_cast<size_t>( |
| 100 (read_value<uint8_t>(&data, &size, &ok) % MAX_NUM_PARAMS) + 1); | 100 (read_value<uint8_t>(&data, &size, &ok) % MAX_NUM_PARAMS) + 1); |
| 101 FunctionSig::Builder sig_builder(&zone, 1, num_params); | 101 FunctionSig::Builder sig_builder(&zone, 1, num_params); |
| 102 sig_builder.AddReturn(kAstI32); | 102 sig_builder.AddReturn(kWasmI32); |
| 103 for (size_t param = 0; param < num_params; param++) { | 103 for (size_t param = 0; param < num_params; param++) { |
| 104 // The main function cannot handle int64 parameters. | 104 // The main function cannot handle int64 parameters. |
| 105 LocalType param_type = types[(read_value<uint8_t>(&data, &size, &ok) % | 105 ValueType param_type = types[(read_value<uint8_t>(&data, &size, &ok) % |
| 106 (arraysize(types) - (fun == 0 ? 1 : 0)))]; | 106 (arraysize(types) - (fun == 0 ? 1 : 0)))]; |
| 107 sig_builder.AddParam(param_type); | 107 sig_builder.AddParam(param_type); |
| 108 if (fun == 0) { | 108 if (fun == 0) { |
| 109 add_argument(i_isolate, param_type, interpreter_args, compiled_args, | 109 add_argument(i_isolate, param_type, interpreter_args, compiled_args, |
| 110 &argc, &data, &size, &ok); | 110 &argc, &data, &size, &ok); |
| 111 } | 111 } |
| 112 } | 112 } |
| 113 v8::internal::wasm::WasmFunctionBuilder* f = | 113 v8::internal::wasm::WasmFunctionBuilder* f = |
| 114 builder.AddFunction(sig_builder.Build()); | 114 builder.AddFunction(sig_builder.Build()); |
| 115 uint32_t code_size = static_cast<uint32_t>(size / num_functions); | 115 uint32_t code_size = static_cast<uint32_t>(size / num_functions); |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 175 // result_compiled. Therefore we do not check the equality of the results | 175 // result_compiled. Therefore we do not check the equality of the results |
| 176 // if the execution may have produced a NaN at some point. | 176 // if the execution may have produced a NaN at some point. |
| 177 if (!possible_nondeterminism && (result_interpreted != result_compiled)) { | 177 if (!possible_nondeterminism && (result_interpreted != result_compiled)) { |
| 178 V8_Fatal(__FILE__, __LINE__, "WasmCodeFuzzerHash=%x", | 178 V8_Fatal(__FILE__, __LINE__, "WasmCodeFuzzerHash=%x", |
| 179 v8::internal::StringHasher::HashSequentialString( | 179 v8::internal::StringHasher::HashSequentialString( |
| 180 data, static_cast<int>(size), WASM_CODE_FUZZER_HASH_SEED)); | 180 data, static_cast<int>(size), WASM_CODE_FUZZER_HASH_SEED)); |
| 181 } | 181 } |
| 182 } | 182 } |
| 183 return 0; | 183 return 0; |
| 184 } | 184 } |
| OLD | NEW |