diff --git a/src/platform-tls-mac.h b/src/platform-tls-mac.h new file mode 100644 index 0000000000..86a3347d0f --- /dev/null +++ b/src/platform-tls-mac.h @@ -0,0 +1,62 @@ +// Copyright 2011 the V8 project authors. All rights reserved. +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following +// disclaimer in the documentation and/or other materials provided +// with the distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifndef V8_PLATFORM_TLS_MAC_H_ +#define V8_PLATFORM_TLS_MAC_H_ + +#include "globals.h" + +namespace v8 { +namespace internal { + +#if defined(V8_HOST_ARCH_IA32) || defined(V8_HOST_ARCH_X64) + +#define V8_FAST_TLS_SUPPORTED 1 + +INLINE(intptr_t InternalGetExistingThreadLocal(intptr_t index)); + +inline intptr_t InternalGetExistingThreadLocal(intptr_t index) { + // The constants below are taken from pthreads.s from the XNU kernel + // sources archive at www.opensource.apple.com. + intptr_t result; +#if defined(V8_HOST_ARCH_IA32) + asm("movl %%gs:0x48(,%1,4), %0;" + :"=r"(result) // Output must be a writable register. + :"0"(index)); // Input is the same as output. +#else + asm("movq %%gs:0x60(,%1,8), %0;" + :"=r"(result) + :"0"(index)); +#endif + return result; +} + +#endif + +} } // namespace v8::internal + +#endif // V8_PLATFORM_TLS_MAC_H_ diff --git a/src/platform-tls.h b/src/platform-tls.h index a7c40e567e..564917540b 100644 --- a/src/platform-tls.h +++ b/src/platform-tls.h @@ -41,6 +41,8 @@ #if defined(_MSC_VER) && (defined(_WIN32) || defined(_WIN64)) #include "platform-tls-win32.h" +#elif defined(__APPLE__) +#include "platform-tls-mac.h" #endif #endif diff --git a/tools/gyp/v8.gyp b/tools/gyp/v8.gyp index 0d3b5cdb26..88044540d3 100644 --- a/tools/gyp/v8.gyp +++ b/tools/gyp/v8.gyp @@ -438,6 +438,7 @@ '../../src/objects.h', '../../src/parser.cc', '../../src/parser.h', + '../../src/platform-tls-mac.h', '../../src/platform-tls-win32.h', '../../src/platform-tls.h', '../../src/platform.h', diff --git a/tools/v8.xcodeproj/project.pbxproj b/tools/v8.xcodeproj/project.pbxproj index 1884199cab..386e7f01c6 100644 --- a/tools/v8.xcodeproj/project.pbxproj +++ b/tools/v8.xcodeproj/project.pbxproj @@ -915,6 +915,7 @@ 89FB0E360F8E531900B04B3C /* d8-posix.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "d8-posix.cc"; path = "../src/d8-posix.cc"; sourceTree = ""; }; 89FB0E370F8E531900B04B3C /* d8-windows.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "d8-windows.cc"; path = "../src/d8-windows.cc"; sourceTree = ""; }; 9C1F8E1D133906180068B362 /* small-pointer-list.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "small-pointer-list.h"; sourceTree = ""; }; + 9C76176D133FB7740057370B /* platform-tls-mac.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "platform-tls-mac.h"; sourceTree = ""; }; 9C8E8061133CF772004058A5 /* platform-tls.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "platform-tls.h"; sourceTree = ""; }; 9F11D99E105AF0A300EBE5B2 /* heap-profiler.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = "heap-profiler.cc"; sourceTree = ""; }; 9F11D99F105AF0A300EBE5B2 /* heap-profiler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "heap-profiler.h"; sourceTree = ""; }; @@ -1239,6 +1240,7 @@ 897FF1670E719B8F00D62E90 /* platform-macos.cc */, 897FF1680E719B8F00D62E90 /* platform-nullos.cc */, 893A72230F7B0FF200303DD2 /* platform-posix.cc */, + 9C76176D133FB7740057370B /* platform-tls-mac.h */, 9C8E8061133CF772004058A5 /* platform-tls.h */, 897FF1690E719B8F00D62E90 /* platform-win32.cc */, 897FF16A0E719B8F00D62E90 /* platform.h */,