// Copyright 2024 the V8 project authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #if !V8_ENABLE_WEBASSEMBLY #error This header should only be included if WebAssembly is enabled. #endif // !V8_ENABLE_WEBASSEMBLY #ifndef V8_WASM_SIGNATURE_HASHING_H_ #define V8_WASM_SIGNATURE_HASHING_H_ #include "src/codegen/linkage-location.h" #include "src/codegen/machine-type.h" #include "src/codegen/signature.h" #include "src/wasm/value-type.h" #include "src/wasm/wasm-linkage.h" namespace v8::internal::wasm { inline MachineRepresentation GetMachineRepresentation(ValueType type) { … } inline MachineRepresentation GetMachineRepresentation(MachineType type) { … } // This shared helper ensures that {GetWasmCallDescriptor} and // {SignatureHasher::Hash} remain in sync. // The {SigType} type must match the {Signature} class, i.e. must support: // size_t parameter_count(); // size_t return_count(); // T GetParam(size_t index); for T in {ValueType, MachineType} // T GetReturn(size_t index); for T in {ValueType, MachineType} // The {ResultCollector} type must match the {LocationSignature::Builder} // class, i.e. must support: // void AddParamAt(size_t index, LinkageLocation location); // void AddReturnAt(size_t index, LinkageLocation location); // {extra_callable_param} configures adding the implicit "callable" parameter // that import call wrappers have, hard-coded to use the kJSFunctionRegister. template <class ResultCollector, class SigType> void IterateSignatureImpl(const SigType* sig, bool extra_callable_param, ResultCollector& locations, int* untagged_parameter_slots, int* total_parameter_slots, int* untagged_return_slots, int* total_return_slots) { … } #if V8_ENABLE_SANDBOX // Computes a "signature hash" for sandbox hardening: two functions should have // the same "signature hash" iff mixing them up (due to in-sandbox corruption) // cannot possibly lead to a sandbox escape. That means in particular that we // must ensure the following properties: // - there must be no tagged/untagged mixups among parameters passed in GP // registers. // - there must be no tagged/untagged mixups among parameters passed on the // stack. // - there must be no mismatch in the sizes of the stack regions used for // passing parameters. // - these same properties must hold for return values. // To achieve this, we simulate the linkage locations that // {GetWasmCallDescriptor} would assign, and collect the counts of // tagged/untagged parameters in registers and on the stack, respectively. class SignatureHasher { … }; #endif // V8_ENABLE_SANDBOX } // namespace v8::internal::wasm #endif // V8_WASM_SIGNATURE_HASHING_H_