5#ifndef V8_EXECUTION_SIMULATOR_BASE_H_
6#define V8_EXECUTION_SIMULATOR_BASE_H_
10#if V8_TARGET_ARCH_ARM64 || V8_TARGET_ARCH_MIPS64 || V8_TARGET_ARCH_LOONG64 || \
11 V8_TARGET_ARCH_RISCV64
19#if defined(USE_SIMULATOR)
30 static void InitializeOncePerProcess();
31 static void GlobalTearDown();
33 static base::Mutex* redirection_mutex() {
return redirection_mutex_; }
34 static Redirection* redirection() {
return redirection_; }
35 static void set_redirection(Redirection*
r) { redirection_ =
r; }
37 static base::Mutex* i_cache_mutex() {
return i_cache_mutex_; }
38 static base::CustomMatcherHashMap* i_cache() {
return i_cache_; }
42 static Address RedirectExternalReference(Address external_function,
43 ExternalReference::Type type);
46 static Address UnwrapRedirection(Address redirection_trampoline);
49 template <
typename Return,
typename SimT,
typename CallImpl,
typename... Args>
50 static Return VariadicCall(SimT* sim, CallImpl call, Address entry,
54 std::array<intptr_t,
sizeof...(args)> args_arr{{ConvertArg(
args)...}};
55 intptr_t ret = (sim->*call)(entry, args_arr.size(), args_arr.data());
56 return ConvertReturn<Return>(ret);
61 static T ConvertReturn(intptr_t ret)
62 requires std::is_integral<T>::value
64 static_assert(
sizeof(
T) <=
sizeof(intptr_t),
"type bigger than ptrsize");
65 return static_cast<T
>(ret);
70 static T ConvertReturn(intptr_t ret)
71 requires std::is_pointer<T>::value
73 return reinterpret_cast<T
>(ret);
77 static T ConvertReturn(intptr_t ret)
78 requires std::is_base_of<Object, T>::value
80 return Tagged<Object>(ret);
83#if V8_TARGET_ARCH_ARM64 || V8_TARGET_ARCH_MIPS64 || V8_TARGET_ARCH_LOONG64 || \
84 V8_TARGET_ARCH_RISCV64
86 static T ConvertReturn(intptr_t ret)
87 requires std::is_same<T, v8::AnyCType>::value
98 static T ConvertReturn(intptr_t ret)
99 requires std::is_void<T>::value
106 template <
typename T>
107 static intptr_t ConvertArg(T arg)
108 requires std::is_integral<T>::value
110 static_assert(
sizeof(
T) <=
sizeof(intptr_t),
"type bigger than ptrsize");
111#if V8_TARGET_ARCH_MIPS64 || V8_TARGET_ARCH_LOONG64 || \
112 V8_TARGET_ARCH_RISCV32 || V8_TARGET_ARCH_RISCV64
115 using signed_t =
typename std::make_signed<T>::type;
116 return static_cast<intptr_t
>(
static_cast<signed_t
>(arg));
120 return static_cast<intptr_t
>(arg);
125 template <
typename T>
126 static intptr_t ConvertArg(T arg)
127 requires std::is_pointer<T>::value
129 return reinterpret_cast<intptr_t
>(arg);
132 template <
typename T>
133 static intptr_t ConvertArg(T arg)
134 requires std::is_floating_point<T>::value
140 static base::Mutex* redirection_mutex_;
141 static Redirection* redirection_;
143 static base::Mutex* i_cache_mutex_;
144 static base::CustomMatcherHashMap* i_cache_;
164 Redirection(Address external_function, ExternalReference::Type type);
166 Address address_of_instruction() {
167#if ABI_USES_FUNCTION_DESCRIPTORS
168 return reinterpret_cast<Address>(function_descriptor_);
170 return reinterpret_cast<Address>(&instruction_);
174 void* external_function() {
175 return reinterpret_cast<void*
>(external_function_);
177 ExternalReference::Type
type() {
return type_; }
179 static Redirection*
Get(Address external_function,
180 ExternalReference::Type type);
182 static Redirection* FromInstruction(Instruction* instruction) {
183 Address addr_of_instruction =
reinterpret_cast<Address>(instruction);
185 addr_of_instruction - offsetof(Redirection, instruction_);
186 return reinterpret_cast<Redirection*
>(addr_of_redirection);
189 static void* UnwrapRedirection(intptr_t
reg) {
190 Redirection* redirection = FromInstruction(
191 reinterpret_cast<Instruction*
>(
reinterpret_cast<void*
>(
reg)));
192 return redirection->external_function();
195 static void DeleteChain(Redirection* redirection) {
196 while (redirection !=
nullptr) {
197 Redirection* next = redirection->next_;
205 uint32_t instruction_;
206 ExternalReference::Type
type_;
208#if ABI_USES_FUNCTION_DESCRIPTORS
209 intptr_t function_descriptor_[3];
223 void RegisterFunctionsAndSignatures(Address* c_functions,
224 const CFunctionInfo*
const* c_signatures,
225 unsigned num_functions);
230 const EncodedCSignature& GetSignatureForTarget(Address target);
232 void AddSignatureForTargetForTesting(Address target,
233 const EncodedCSignature& signature) {
234 AddSignatureForTarget(target, signature);
238 void AddSignatureForTarget(Address target,
239 const EncodedCSignature& signature) {
240 target_to_signature_table_[
target] = signature;
244 typedef std::unordered_map<Address, EncodedCSignature> TargetToSignatureTable;
245 TargetToSignatureTable target_to_signature_table_;
base::Vector< const DirectHandle< Object > > args
ZoneVector< RpoNumber > & result
V8_INLINE const Operation & Get(const Graph &graph, OpIndex index)