Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(53)

Unified Diff: src/compiler/wasm-linkage.cc

Issue 2202433003: [wasm] Use a LazyInstance in wasm-linkage.cc to avoid a data race. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 4 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/compiler/c-linkage.cc ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/compiler/wasm-linkage.cc
diff --git a/src/compiler/wasm-linkage.cc b/src/compiler/wasm-linkage.cc
index 6537219cc074cdfcb5fb7c1eb7c6e039c2331fcf..c50f643910b4b9ebdaee5f743244d0bde3e97bdb 100644
--- a/src/compiler/wasm-linkage.cc
+++ b/src/compiler/wasm-linkage.cc
@@ -3,6 +3,7 @@
// found in the LICENSE file.
#include "src/assembler.h"
+#include "src/base/lazy-instance.h"
#include "src/macro-assembler.h"
#include "src/register-configuration.h"
@@ -206,55 +207,61 @@ struct Allocator {
};
} // namespace
-static Allocator GetReturnRegisters() {
-#ifdef GP_RETURN_REGISTERS
- static const Register kGPReturnRegisters[] = {GP_RETURN_REGISTERS};
- static const int kGPReturnRegistersCount =
- static_cast<int>(arraysize(kGPReturnRegisters));
+struct ParameterRegistersCreateTrait {
+ static void Construct(Allocator* allocated_ptr) {
+#ifdef GP_PARAM_REGISTERS
+ static const Register kGPParamRegisters[] = {GP_PARAM_REGISTERS};
+ static const int kGPParamRegistersCount =
+ static_cast<int>(arraysize(kGPParamRegisters));
#else
- static const Register* kGPReturnRegisters = nullptr;
- static const int kGPReturnRegistersCount = 0;
+ static const Register* kGPParamRegisters = nullptr;
+ static const int kGPParamRegistersCount = 0;
#endif
-#ifdef FP_RETURN_REGISTERS
- static const DoubleRegister kFPReturnRegisters[] = {FP_RETURN_REGISTERS};
- static const int kFPReturnRegistersCount =
- static_cast<int>(arraysize(kFPReturnRegisters));
+#ifdef FP_PARAM_REGISTERS
+ static const DoubleRegister kFPParamRegisters[] = {FP_PARAM_REGISTERS};
+ static const int kFPParamRegistersCount =
+ static_cast<int>(arraysize(kFPParamRegisters));
#else
- static const DoubleRegister* kFPReturnRegisters = nullptr;
- static const int kFPReturnRegistersCount = 0;
+ static const DoubleRegister* kFPParamRegisters = nullptr;
+ static const int kFPParamRegistersCount = 0;
#endif
- Allocator rets(kGPReturnRegisters, kGPReturnRegistersCount,
- kFPReturnRegisters, kFPReturnRegistersCount);
+ new (allocated_ptr) Allocator(kGPParamRegisters, kGPParamRegistersCount,
+ kFPParamRegisters, kFPParamRegistersCount);
+ }
+};
- return rets;
-}
+static base::LazyInstance<Allocator, ParameterRegistersCreateTrait>::type
+ parameter_registers = LAZY_INSTANCE_INITIALIZER;
-static Allocator GetParameterRegisters() {
-#ifdef GP_PARAM_REGISTERS
- static const Register kGPParamRegisters[] = {GP_PARAM_REGISTERS};
- static const int kGPParamRegistersCount =
- static_cast<int>(arraysize(kGPParamRegisters));
+struct ReturnRegistersCreateTrait {
+ static void Construct(Allocator* allocated_ptr) {
+#ifdef GP_RETURN_REGISTERS
+ static const Register kGPReturnRegisters[] = {GP_RETURN_REGISTERS};
+ static const int kGPReturnRegistersCount =
+ static_cast<int>(arraysize(kGPReturnRegisters));
#else
- static const Register* kGPParamRegisters = nullptr;
- static const int kGPParamRegistersCount = 0;
+ static const Register* kGPReturnRegisters = nullptr;
+ static const int kGPReturnRegistersCount = 0;
#endif
-#ifdef FP_PARAM_REGISTERS
- static const DoubleRegister kFPParamRegisters[] = {FP_PARAM_REGISTERS};
- static const int kFPParamRegistersCount =
- static_cast<int>(arraysize(kFPParamRegisters));
+#ifdef FP_RETURN_REGISTERS
+ static const DoubleRegister kFPReturnRegisters[] = {FP_RETURN_REGISTERS};
+ static const int kFPReturnRegistersCount =
+ static_cast<int>(arraysize(kFPReturnRegisters));
#else
- static const DoubleRegister* kFPParamRegisters = nullptr;
- static const int kFPParamRegistersCount = 0;
+ static const DoubleRegister* kFPReturnRegisters = nullptr;
+ static const int kFPReturnRegistersCount = 0;
#endif
- Allocator params(kGPParamRegisters, kGPParamRegistersCount, kFPParamRegisters,
- kFPParamRegistersCount);
+ new (allocated_ptr) Allocator(kGPReturnRegisters, kGPReturnRegistersCount,
+ kFPReturnRegisters, kFPReturnRegistersCount);
+ }
+};
- return params;
-}
+static base::LazyInstance<Allocator, ReturnRegistersCreateTrait>::type
+ return_registers = LAZY_INSTANCE_INITIALIZER;
// General code uses the above configuration data.
CallDescriptor* ModuleEnv::GetWasmCallDescriptor(Zone* zone,
@@ -262,7 +269,7 @@ CallDescriptor* ModuleEnv::GetWasmCallDescriptor(Zone* zone,
LocationSignature::Builder locations(zone, fsig->return_count(),
fsig->parameter_count());
- Allocator rets = GetReturnRegisters();
+ Allocator rets = return_registers.Get();
// Add return location(s).
const int return_count = static_cast<int>(locations.return_count_);
@@ -271,7 +278,7 @@ CallDescriptor* ModuleEnv::GetWasmCallDescriptor(Zone* zone,
locations.AddReturn(rets.Next(ret));
}
- Allocator params = GetParameterRegisters();
+ Allocator params = parameter_registers.Get();
// Add register and/or stack parameter(s).
const int parameter_count = static_cast<int>(fsig->parameter_count());
@@ -325,7 +332,7 @@ CallDescriptor* ModuleEnv::GetI32WasmCallDescriptor(
LocationSignature::Builder locations(zone, return_count, parameter_count);
- Allocator rets = GetReturnRegisters();
+ Allocator rets = return_registers.Get();
for (size_t i = 0; i < descriptor->ReturnCount(); i++) {
if (descriptor->GetReturnType(i) == MachineType::Int64()) {
@@ -338,7 +345,7 @@ CallDescriptor* ModuleEnv::GetI32WasmCallDescriptor(
}
}
- Allocator params = GetParameterRegisters();
+ Allocator params = parameter_registers.Get();
for (size_t i = 0; i < descriptor->ParameterCount(); i++) {
if (descriptor->GetParameterType(i) == MachineType::Int64()) {
« no previous file with comments | « src/compiler/c-linkage.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698