Changeset 213753 in webkit
- Timestamp:
- Mar 10, 2017 11:17:48 PM (7 years ago)
- Location:
- trunk/Source
- Files:
-
- 1 added
- 14 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/JavaScriptCore/ChangeLog
r213752 r213753 1 2017-03-10 Filip Pizlo <fpizlo@apple.com> 2 3 The JITs should be able to emit fast TLS loads 4 https://bugs.webkit.org/show_bug.cgi?id=169483 5 6 Reviewed by Keith Miller. 7 8 Added loadFromTLS32/64/Ptr to the MacroAssembler and added a B3 test for this. 9 10 * assembler/ARM64Assembler.h: 11 (JSC::ARM64Assembler::mrs_TPIDRRO_EL0): 12 * assembler/MacroAssembler.h: 13 (JSC::MacroAssembler::loadFromTLSPtr): 14 * assembler/MacroAssemblerARM64.h: 15 (JSC::MacroAssemblerARM64::loadFromTLS32): 16 (JSC::MacroAssemblerARM64::loadFromTLS64): 17 * assembler/MacroAssemblerX86Common.h: 18 (JSC::MacroAssemblerX86Common::loadFromTLS32): 19 * assembler/MacroAssemblerX86_64.h: 20 (JSC::MacroAssemblerX86_64::loadFromTLS64): 21 * assembler/X86Assembler.h: 22 (JSC::X86Assembler::adcl_im): 23 (JSC::X86Assembler::addl_mr): 24 (JSC::X86Assembler::addl_im): 25 (JSC::X86Assembler::andl_im): 26 (JSC::X86Assembler::orl_im): 27 (JSC::X86Assembler::orl_rm): 28 (JSC::X86Assembler::subl_im): 29 (JSC::X86Assembler::cmpb_im): 30 (JSC::X86Assembler::cmpl_rm): 31 (JSC::X86Assembler::cmpl_im): 32 (JSC::X86Assembler::testb_im): 33 (JSC::X86Assembler::movb_i8m): 34 (JSC::X86Assembler::movb_rm): 35 (JSC::X86Assembler::movl_mr): 36 (JSC::X86Assembler::movq_mr): 37 (JSC::X86Assembler::movsxd_rr): 38 (JSC::X86Assembler::gs): 39 (JSC::X86Assembler::X86InstructionFormatter::SingleInstructionBufferWriter::memoryModRM): 40 * b3/testb3.cpp: 41 (JSC::B3::testFastTLS): 42 (JSC::B3::run): 43 1 44 2017-03-10 Alex Christensen <achristensen@webkit.org> 2 45 -
trunk/Source/JavaScriptCore/assembler/ARM64Assembler.h
r213714 r213753 1589 1589 insn(exoticStore(MEMOPSIZE, ExoticStoreFence_Release, result, src, dst)); 1590 1590 } 1591 1592 #if ENABLE(FAST_TLS_JIT) 1593 void mrs_TPIDRRO_EL0(RegisterID dst) 1594 { 1595 insn(0xd53bd060 | dst); // Thanks, otool -t! 1596 } 1597 #endif 1591 1598 1592 1599 template<int datasize> -
trunk/Source/JavaScriptCore/assembler/MacroAssembler.h
r213714 r213753 628 628 } 629 629 630 #if ENABLE(FAST_TLS_JIT) 631 void loadFromTLSPtr(uint32_t offset, RegisterID dst) 632 { 633 loadFromTLS32(offset, dst); 634 } 635 #endif 636 630 637 DataLabel32 loadPtrWithAddressOffsetPatch(Address address, RegisterID dest) 631 638 { … … 934 941 load64(address, dest); 935 942 } 943 944 #if ENABLE(FAST_TLS_JIT) 945 void loadFromTLSPtr(uint32_t offset, RegisterID dst) 946 { 947 loadFromTLS64(offset, dst); 948 } 949 #endif 936 950 937 951 DataLabel32 loadPtrWithAddressOffsetPatch(Address address, RegisterID dest) -
trunk/Source/JavaScriptCore/assembler/MacroAssemblerARM64.h
r213714 r213753 3599 3599 } 3600 3600 3601 #if ENABLE(FAST_TLS_JIT) 3602 // This will use scratch registers if the offset is not legal. 3603 3604 void loadFromTLS32(uint32_t offset, RegisterID dst) 3605 { 3606 m_assembler.mrs_TPIDRRO_EL0(dst); 3607 and64(TrustedImm32(~7), dst); 3608 load32(Address(dst, offset), dst); 3609 } 3610 3611 void loadFromTLS64(uint32_t offset, RegisterID dst) 3612 { 3613 m_assembler.mrs_TPIDRRO_EL0(dst); 3614 and64(TrustedImm32(~7), dst); 3615 load64(Address(dst, offset), dst); 3616 } 3617 #endif // ENABLE(FAST_TLS_JIT) 3618 3601 3619 // Misc helper functions. 3602 3620 -
trunk/Source/JavaScriptCore/assembler/MacroAssemblerX86Common.h
r213714 r213753 3858 3858 { 3859 3859 } 3860 3861 #if ENABLE(FAST_TLS_JIT) 3862 void loadFromTLS32(uint32_t offset, RegisterID dst) 3863 { 3864 m_assembler.gs(); 3865 m_assembler.movl_mr(offset, dst); 3866 } 3867 #endif 3860 3868 3861 3869 static void replaceWithBreakpoint(CodeLocationLabel instructionStart) -
trunk/Source/JavaScriptCore/assembler/MacroAssemblerX86_64.h
r213714 r213753 1702 1702 } 1703 1703 1704 #if ENABLE(FAST_TLS_JIT) 1705 void loadFromTLS64(uint32_t offset, RegisterID dst) 1706 { 1707 m_assembler.gs(); 1708 m_assembler.movl_mr(offset, dst); 1709 } 1710 #endif 1711 1704 1712 void truncateDoubleToUint32(FPRegisterID src, RegisterID dest) 1705 1713 { -
trunk/Source/JavaScriptCore/assembler/X86Assembler.h
r213714 r213753 219 219 OP_MOVSXD_GvEv = 0x63, 220 220 #endif 221 PRE_GS = 0x65, 221 222 PRE_OPERAND_SIZE = 0x66, 222 223 PRE_SSE_66 = 0x66, … … 432 433 { 433 434 if (CAN_SIGN_EXTEND_8_32(imm)) { 434 m_formatter.oneByteOp (OP_GROUP1_EvIb, GROUP1_OP_ADC, addr);435 m_formatter.immediate8(imm); 436 } else { 437 m_formatter.oneByteOp (OP_GROUP1_EvIz, GROUP1_OP_ADC, addr);435 m_formatter.oneByteOpAddr(OP_GROUP1_EvIb, GROUP1_OP_ADC, bitwise_cast<uint32_t>(addr)); 436 m_formatter.immediate8(imm); 437 } else { 438 m_formatter.oneByteOpAddr(OP_GROUP1_EvIz, GROUP1_OP_ADC, bitwise_cast<uint32_t>(addr)); 438 439 m_formatter.immediate32(imm); 439 440 } … … 459 460 void addl_mr(const void* addr, RegisterID dst) 460 461 { 461 m_formatter.oneByteOp (OP_ADD_GvEv, dst, addr);462 m_formatter.oneByteOpAddr(OP_ADD_GvEv, dst, bitwise_cast<uint32_t>(addr)); 462 463 } 463 464 #endif … … 632 633 { 633 634 if (CAN_SIGN_EXTEND_8_32(imm)) { 634 m_formatter.oneByteOp (OP_GROUP1_EvIb, GROUP1_OP_ADD, addr);635 m_formatter.immediate8(imm); 636 } else { 637 m_formatter.oneByteOp (OP_GROUP1_EvIz, GROUP1_OP_ADD, addr);635 m_formatter.oneByteOpAddr(OP_GROUP1_EvIb, GROUP1_OP_ADD, bitwise_cast<uint32_t>(addr)); 636 m_formatter.immediate8(imm); 637 } else { 638 m_formatter.oneByteOpAddr(OP_GROUP1_EvIz, GROUP1_OP_ADD, bitwise_cast<uint32_t>(addr)); 638 639 m_formatter.immediate32(imm); 639 640 } … … 819 820 { 820 821 if (CAN_SIGN_EXTEND_8_32(imm)) { 821 m_formatter.oneByteOp (OP_GROUP1_EvIb, GROUP1_OP_AND, addr);822 m_formatter.immediate8(imm); 823 } else { 824 m_formatter.oneByteOp (OP_GROUP1_EvIz, GROUP1_OP_AND, addr);822 m_formatter.oneByteOpAddr(OP_GROUP1_EvIb, GROUP1_OP_AND, bitwise_cast<uint32_t>(addr)); 823 m_formatter.immediate8(imm); 824 } else { 825 m_formatter.oneByteOpAddr(OP_GROUP1_EvIz, GROUP1_OP_AND, bitwise_cast<uint32_t>(addr)); 825 826 m_formatter.immediate32(imm); 826 827 } … … 1160 1161 { 1161 1162 if (CAN_SIGN_EXTEND_8_32(imm)) { 1162 m_formatter.oneByteOp (OP_GROUP1_EvIb, GROUP1_OP_OR, addr);1163 m_formatter.immediate8(imm); 1164 } else { 1165 m_formatter.oneByteOp (OP_GROUP1_EvIz, GROUP1_OP_OR, addr);1163 m_formatter.oneByteOpAddr(OP_GROUP1_EvIb, GROUP1_OP_OR, bitwise_cast<uint32_t>(addr)); 1164 m_formatter.immediate8(imm); 1165 } else { 1166 m_formatter.oneByteOpAddr(OP_GROUP1_EvIz, GROUP1_OP_OR, bitwise_cast<uint32_t>(addr)); 1166 1167 m_formatter.immediate32(imm); 1167 1168 } … … 1170 1171 void orl_rm(RegisterID src, const void* addr) 1171 1172 { 1172 m_formatter.oneByteOp (OP_OR_EvGv, src, addr);1173 m_formatter.oneByteOpAddr(OP_OR_EvGv, src, bitwise_cast<uint32_t>(addr)); 1173 1174 } 1174 1175 #endif … … 1358 1359 { 1359 1360 if (CAN_SIGN_EXTEND_8_32(imm)) { 1360 m_formatter.oneByteOp (OP_GROUP1_EvIb, GROUP1_OP_SUB, addr);1361 m_formatter.immediate8(imm); 1362 } else { 1363 m_formatter.oneByteOp (OP_GROUP1_EvIz, GROUP1_OP_SUB, addr);1361 m_formatter.oneByteOpAddr(OP_GROUP1_EvIb, GROUP1_OP_SUB, bitwise_cast<uint32_t>(addr)); 1362 m_formatter.immediate8(imm); 1363 } else { 1364 m_formatter.oneByteOpAddr(OP_GROUP1_EvIz, GROUP1_OP_SUB, bitwise_cast<uint32_t>(addr)); 1364 1365 m_formatter.immediate32(imm); 1365 1366 } … … 1858 1859 void cmpb_im(int imm, const void* addr) 1859 1860 { 1860 m_formatter.oneByteOp (OP_GROUP1_EbIb, GROUP1_OP_CMP, addr);1861 m_formatter.oneByteOpAddr(OP_GROUP1_EbIb, GROUP1_OP_CMP, bitwise_cast<uint32_t>(addr)); 1861 1862 m_formatter.immediate8(imm); 1862 1863 } … … 1939 1940 void cmpl_rm(RegisterID reg, const void* addr) 1940 1941 { 1941 m_formatter.oneByteOp (OP_CMP_EvGv, reg, addr);1942 m_formatter.oneByteOpAddr(OP_CMP_EvGv, reg, bitwise_cast<uint32_t>(addr)); 1942 1943 } 1943 1944 … … 1945 1946 { 1946 1947 if (CAN_SIGN_EXTEND_8_32(imm)) { 1947 m_formatter.oneByteOp (OP_GROUP1_EvIb, GROUP1_OP_CMP, addr);1948 m_formatter.immediate8(imm); 1949 } else { 1950 m_formatter.oneByteOp (OP_GROUP1_EvIz, GROUP1_OP_CMP, addr);1948 m_formatter.oneByteOpAddr(OP_GROUP1_EvIb, GROUP1_OP_CMP, bitwise_cast<uint32_t>(addr)); 1949 m_formatter.immediate8(imm); 1950 } else { 1951 m_formatter.oneByteOpAddr(OP_GROUP1_EvIz, GROUP1_OP_CMP, bitwise_cast<uint32_t>(addr)); 1951 1952 m_formatter.immediate32(imm); 1952 1953 } … … 2026 2027 void testb_im(int imm, const void* addr) 2027 2028 { 2028 m_formatter.oneByteOp (OP_GROUP3_EbIb, GROUP3_OP_TEST, addr);2029 m_formatter.oneByteOpAddr(OP_GROUP3_EbIb, GROUP3_OP_TEST, bitwise_cast<uint32_t>(addr)); 2029 2030 m_formatter.immediate8(imm); 2030 2031 } … … 2280 2281 { 2281 2282 ASSERT(-128 <= imm && imm < 128); 2282 m_formatter.oneByteOp (OP_GROUP11_EvIb, GROUP11_MOV, addr);2283 m_formatter.oneByteOpAddr(OP_GROUP11_EvIb, GROUP11_MOV, bitwise_cast<uint32_t>(addr)); 2283 2284 m_formatter.immediate8(imm); 2284 2285 } … … 2302 2303 void movb_rm(RegisterID src, const void* addr) 2303 2304 { 2304 m_formatter.oneByteOp (OP_MOV_EbGb, src, addr);2305 m_formatter.oneByteOpAddr(OP_MOV_EbGb, src, bitwise_cast<uint32_t>(addr)); 2305 2306 } 2306 2307 #endif … … 2355 2356 } 2356 2357 2358 void movl_mr(uint32_t addr, RegisterID dst) 2359 { 2360 m_formatter.oneByteOpAddr(OP_MOV_GvEv, dst, addr); 2361 } 2362 2357 2363 #if CPU(X86_64) 2358 2364 void movq_rr(RegisterID src, RegisterID dst) … … 2408 2414 } 2409 2415 2416 void movq_mr(uint32_t addr, RegisterID dst) 2417 { 2418 m_formatter.oneByteOp64Addr(OP_MOV_GvEv, dst, addr); 2419 } 2420 2410 2421 void movq_i32m(int imm, int offset, RegisterID base) 2411 2422 { … … 2436 2447 m_formatter.oneByteOp64(OP_MOVSXD_GvEv, dst, src); 2437 2448 } 2438 2439 2440 2449 #else 2450 void movl_mr(const void* addr, RegisterID dst) 2451 { 2452 if (dst == X86Registers::eax) 2453 movl_mEAX(addr); 2454 else 2455 m_formatter.oneByteOpAddr(OP_MOV_GvEv, dst, bitwise_cast<uint32_t>(addr)); 2456 } 2457 2441 2458 void movl_rm(RegisterID src, const void* addr) 2442 2459 { … … 2444 2461 movl_EAXm(addr); 2445 2462 else 2446 m_formatter.oneByteOp(OP_MOV_EvGv, src, addr); 2447 } 2448 2449 void movl_mr(const void* addr, RegisterID dst) 2450 { 2451 if (dst == X86Registers::eax) 2452 movl_mEAX(addr); 2453 else 2454 m_formatter.oneByteOp(OP_MOV_GvEv, dst, addr); 2455 } 2456 2463 m_formatter.oneByteOpAddr(OP_MOV_EvGv, src, bitwise_cast<uint32_t>(addr)); 2464 } 2465 2457 2466 void movl_i32m(int imm, const void* addr) 2458 2467 { 2459 m_formatter.oneByteOp (OP_GROUP11_EvIz, GROUP11_MOV, addr);2468 m_formatter.oneByteOpAddr(OP_GROUP11_EvIz, GROUP11_MOV, bitwise_cast<uint32_t>(addr)); 2460 2469 m_formatter.immediate32(imm); 2461 2470 } … … 2495 2504 void movzbl_mr(const void* address, RegisterID dst) 2496 2505 { 2497 m_formatter.twoByteOp (OP2_MOVZX_GvEb, dst, address);2506 m_formatter.twoByteOpAddr(OP2_MOVZX_GvEb, dst, bitwise_cast<uint32_t>(address)); 2498 2507 } 2499 2508 #endif … … 2605 2614 void cmovl_mr(Condition cond, const void* addr, RegisterID dst) 2606 2615 { 2607 m_formatter.twoByteOp (cmovcc(cond), dst, addr);2616 m_formatter.twoByteOpAddr(cmovcc(cond), dst, bitwise_cast<uint32_t>(addr)); 2608 2617 } 2609 2618 #endif … … 2678 2687 void jmp_m(const void* address) 2679 2688 { 2680 m_formatter.oneByteOp (OP_GROUP5_Ev, GROUP5_OP_JMPN, address);2689 m_formatter.oneByteOpAddr(OP_GROUP5_Ev, GROUP5_OP_JMPN, bitwise_cast<uint32_t>(address)); 2681 2690 } 2682 2691 #endif … … 2854 2863 { 2855 2864 m_formatter.prefix(PRE_SSE_F2); 2856 m_formatter.twoByteOp (OP2_ADDSD_VsdWsd, (RegisterID)dst, address);2865 m_formatter.twoByteOpAddr(OP2_ADDSD_VsdWsd, (RegisterID)dst, bitwise_cast<uint32_t>(address)); 2857 2866 } 2858 2867 #endif … … 2912 2921 { 2913 2922 m_formatter.prefix(PRE_SSE_F2); 2914 m_formatter.twoByteOp (OP2_CVTSI2SD_VsdEd, (RegisterID)dst, address);2923 m_formatter.twoByteOpAddr(OP2_CVTSI2SD_VsdEd, (RegisterID)dst, bitwise_cast<uint32_t>(address)); 2915 2924 } 2916 2925 #endif … … 3069 3078 { 3070 3079 m_formatter.prefix(PRE_SSE_F2); 3071 m_formatter.twoByteOp (OP2_MOVSD_VsdWsd, (RegisterID)dst, address);3080 m_formatter.twoByteOpAddr(OP2_MOVSD_VsdWsd, (RegisterID)dst, bitwise_cast<uint32_t>(address)); 3072 3081 } 3073 3082 void movsd_rm(XMMRegisterID src, const void* address) 3074 3083 { 3075 3084 m_formatter.prefix(PRE_SSE_F2); 3076 m_formatter.twoByteOp (OP2_MOVSD_WsdVsd, (RegisterID)src, address);3085 m_formatter.twoByteOpAddr(OP2_MOVSD_WsdVsd, (RegisterID)src, bitwise_cast<uint32_t>(address)); 3077 3086 } 3078 3087 #endif … … 3399 3408 { 3400 3409 m_formatter.prefix(PRE_LOCK); 3410 } 3411 3412 // Causes the memory access in the next instruction to be offset by %gs. Usually you use 3413 // this with a 32-bit absolute address load. That "address" ends up being the offset to 3414 // %gs. This prefix is ignored by lea. Getting the value of %gs is hard - you can pretty 3415 // much just use it as a secret offset. 3416 void gs() 3417 { 3418 m_formatter.prefix(PRE_GS); 3401 3419 } 3402 3420 … … 4054 4072 } 4055 4073 4056 #if !CPU(X86_64) 4057 ALWAYS_INLINE void memoryModRM(int reg, const void* address) 4074 ALWAYS_INLINE void memoryModRMAddr(int reg, uint32_t address) 4058 4075 { 4076 #if CPU(X86_64) 4077 putModRmSib(ModRmMemoryNoDisp, reg, noBase, noIndex, 0); 4078 #else 4059 4079 // noBase + ModRmMemoryNoDisp means noBase + ModRmMemoryDisp32! 4060 4080 putModRm(ModRmMemoryNoDisp, reg, noBase); 4061 putIntUnchecked(reinterpret_cast<int32_t>(address)); 4081 #endif 4082 putIntUnchecked(address); 4062 4083 } 4063 #endif 4084 4064 4085 ALWAYS_INLINE void twoBytesVex(OneByteOpcodeID simdPrefix, RegisterID inOpReg, RegisterID r) 4065 4086 { … … 4186 4207 } 4187 4208 4188 #if !CPU(X86_64) 4189 void oneByteOp(OneByteOpcodeID opcode, int reg, const void* address) 4209 void oneByteOpAddr(OneByteOpcodeID opcode, int reg, uint32_t address) 4190 4210 { 4191 4211 SingleInstructionBufferWriter writer(m_buffer); 4192 4212 writer.putByteUnchecked(opcode); 4193 writer.memoryModRM(reg, address); 4194 } 4195 #endif 4213 writer.memoryModRMAddr(reg, address); 4214 } 4196 4215 4197 4216 void twoByteOp(TwoByteOpcodeID opcode) … … 4229 4248 } 4230 4249 4231 #if !CPU(X86_64) 4232 void twoByteOp(TwoByteOpcodeID opcode, int reg, const void* address) 4250 void twoByteOpAddr(TwoByteOpcodeID opcode, int reg, uint32_t address) 4233 4251 { 4234 4252 SingleInstructionBufferWriter writer(m_buffer); 4235 4253 writer.putByteUnchecked(OP_2BYTE_ESCAPE); 4236 4254 writer.putByteUnchecked(opcode); 4237 writer.memoryModRM (reg, address);4238 } 4239 #endif 4255 writer.memoryModRMAddr(reg, address); 4256 } 4257 4240 4258 void vexNdsLigWigTwoByteOp(OneByteOpcodeID simdPrefix, TwoByteOpcodeID opcode, RegisterID dest, RegisterID a, RegisterID b) 4241 4259 { … … 4366 4384 writer.putByteUnchecked(opcode); 4367 4385 writer.memoryModRM(reg, base, index, scale, offset); 4386 } 4387 4388 void oneByteOp64Addr(OneByteOpcodeID opcode, int reg, uint32_t address) 4389 { 4390 SingleInstructionBufferWriter writer(m_buffer); 4391 writer.emitRexW(reg, 0, 0); 4392 writer.putByteUnchecked(opcode); 4393 writer.memoryModRMAddr(reg, address); 4368 4394 } 4369 4395 -
trunk/Source/JavaScriptCore/b3/testb3.cpp
r213714 r213753 70 70 #include <cmath> 71 71 #include <string> 72 #include <wtf/FastTLS.h> 72 73 #include <wtf/ListDump.h> 73 74 #include <wtf/Lock.h> … … 15209 15210 for (unsigned value : values) 15210 15211 CHECK_EQ(numToStore, value); 15212 } 15213 15214 void testFastTLS() 15215 { 15216 #if ENABLE(FAST_TLS_JIT) 15217 _pthread_setspecific_direct(WTF_TESTING_KEY, bitwise_cast<void*>(static_cast<uintptr_t>(0xbeef))); 15218 15219 Procedure proc; 15220 BasicBlock* root = proc.addBlock(); 15221 15222 PatchpointValue* patchpoint = root->appendNew<PatchpointValue>(proc, pointerType(), Origin()); 15223 patchpoint->clobber(RegisterSet::macroScratchRegisters()); 15224 patchpoint->setGenerator( 15225 [&] (CCallHelpers& jit, const StackmapGenerationParams& params) { 15226 AllowMacroScratchRegisterUsage allowScratch(jit); 15227 jit.loadFromTLSPtr(fastTLSOffsetForKey(WTF_TESTING_KEY), params[0].gpr()); 15228 }); 15229 15230 root->appendNew<Value>(proc, Return, Origin(), patchpoint); 15231 15232 CHECK_EQ(compileAndRun<uintptr_t>(proc), static_cast<uintptr_t>(0xbeef)); 15233 #endif 15211 15234 } 15212 15235 … … 16737 16760 RUN(testWasmBoundsCheck(std::numeric_limits<unsigned>::max() - 5)); 16738 16761 RUN(testWasmAddress()); 16762 16763 RUN(testFastTLS()); 16739 16764 16740 16765 if (isX86()) { -
trunk/Source/WTF/ChangeLog
r213743 r213753 1 2017-03-10 Filip Pizlo <fpizlo@apple.com> 2 3 The JITs should be able to emit fast TLS loads 4 https://bugs.webkit.org/show_bug.cgi?id=169483 5 6 Reviewed by Keith Miller. 7 8 Consolidated what we know about fast TLS in FastTLS.h. 9 10 * WTF.xcodeproj/project.pbxproj: 11 * wtf/CMakeLists.txt: 12 * wtf/FastTLS.h: Added. 13 (WTF::loadFastTLS): 14 (WTF::fastTLSOffsetForKey): 15 * wtf/Platform.h: 16 * wtf/WTFThreadData.cpp: 17 (WTF::WTFThreadData::createAndRegisterForGetspecificDirect): 18 * wtf/WTFThreadData.h: 19 (WTF::wtfThreadData): 20 1 21 2017-03-10 Mark Lam <mark.lam@apple.com> 2 22 -
trunk/Source/WTF/WTF.xcodeproj/project.pbxproj
r213214 r213753 44 44 0F66B2931DC97BAB004A1D3F /* WallTime.h in Headers */ = {isa = PBXBuildFile; fileRef = 0F66B2891DC97BAB004A1D3F /* WallTime.h */; }; 45 45 0F725CAC1C50461600AD943A /* RangeSet.h in Headers */ = {isa = PBXBuildFile; fileRef = 0F725CAB1C50461600AD943A /* RangeSet.h */; }; 46 0F79C7C41E73511800EB34D1 /* FastTLS.h in Headers */ = {isa = PBXBuildFile; fileRef = 0F79C7C31E73511800EB34D1 /* FastTLS.h */; }; 46 47 0F7C5FB61D885CF20044F5E2 /* FastBitVector.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0F7C5FB51D885CF20044F5E2 /* FastBitVector.cpp */; }; 47 48 0F824A681B7443A0002E345D /* ParkingLot.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0F824A641B7443A0002E345D /* ParkingLot.cpp */; }; … … 422 423 0F66B2891DC97BAB004A1D3F /* WallTime.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WallTime.h; sourceTree = "<group>"; }; 423 424 0F725CAB1C50461600AD943A /* RangeSet.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RangeSet.h; sourceTree = "<group>"; }; 425 0F79C7C31E73511800EB34D1 /* FastTLS.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FastTLS.h; sourceTree = "<group>"; }; 424 426 0F7C5FB51D885CF20044F5E2 /* FastBitVector.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = FastBitVector.cpp; sourceTree = "<group>"; }; 425 427 0F824A641B7443A0002E345D /* ParkingLot.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ParkingLot.cpp; sourceTree = "<group>"; }; … … 975 977 A8A472A1151A825A004123FF /* FastMalloc.cpp */, 976 978 A8A472A2151A825A004123FF /* FastMalloc.h */, 979 0F79C7C31E73511800EB34D1 /* FastTLS.h */, 977 980 B38FD7BC168953E80065C969 /* FeatureDefines.h */, 978 981 0F9D335B165DBA73005AD387 /* FilePrintStream.cpp */, … … 1487 1490 A8A473EF151A825B004123FF /* Noncopyable.h in Headers */, 1488 1491 CE46516E19DB1FB4003ECA05 /* NSMapTableSPI.h in Headers */, 1492 0F79C7C41E73511800EB34D1 /* FastTLS.h in Headers */, 1489 1493 A8A473F5151A825B004123FF /* NumberOfCores.h in Headers */, 1490 1494 7E29C33E15FFD79B00516D61 /* ObjcRuntimeExtras.h in Headers */, -
trunk/Source/WTF/wtf/CMakeLists.txt
r213214 r213753 31 31 DoublyLinkedList.h 32 32 FastMalloc.h 33 FastTLS.h 33 34 FeatureDefines.h 34 35 FilePrintStream.h -
trunk/Source/WTF/wtf/Platform.h
r213743 r213753 762 762 #endif // CPU(ARM64) 763 763 764 #if __has_include(<System/pthread_machdep.h>) 765 #define HAVE_FAST_TLS 1 766 #endif 767 768 #if (CPU(X86_64) || CPU(ARM64)) && HAVE(FAST_TLS) 769 #define ENABLE_FAST_TLS_JIT 1 770 #endif 771 764 772 /* This controls whether B3 is built. B3 is needed for FTL JIT and WebAssembly */ 765 773 #if ENABLE(FTL_JIT) || ENABLE(WEBASSEMBLY) -
trunk/Source/WTF/wtf/WTFThreadData.cpp
r187026 r213753 36 36 namespace WTF { 37 37 38 #if ! USE(PTHREAD_GETSPECIFIC_DIRECT)38 #if !HAVE(FAST_TLS) 39 39 ThreadSpecific<WTFThreadData>* WTFThreadData::staticData; 40 40 #endif … … 62 62 } 63 63 64 #if USE(PTHREAD_GETSPECIFIC_DIRECT)64 #if HAVE(FAST_TLS) 65 65 WTFThreadData& WTFThreadData::createAndRegisterForGetspecificDirect() 66 66 { 67 67 WTFThreadData* data = new WTFThreadData; 68 _pthread_setspecific_direct( directKey, data);69 pthread_key_init_np( directKey, [](void* data){68 _pthread_setspecific_direct(WTF_THREAD_DATA_KEY, data); 69 pthread_key_init_np(WTF_THREAD_DATA_KEY, [](void* data){ 70 70 delete static_cast<WTFThreadData*>(data); 71 71 }); -
trunk/Source/WTF/wtf/WTFThreadData.h
r205895 r213753 1 1 /* 2 * Copyright (C) 2008 Apple Inc. All Rights Reserved.2 * Copyright (C) 2008-2017 Apple Inc. All Rights Reserved. 3 3 * 4 4 * Redistribution and use in source and binary forms, with or without … … 28 28 #define WTFThreadData_h 29 29 30 #include <wtf/FastTLS.h> 30 31 #include <wtf/HashMap.h> 31 32 #include <wtf/HashSet.h> … … 33 34 #include <wtf/StackBounds.h> 34 35 #include <wtf/StackStats.h> 35 #include <wtf/text/StringHash.h>36 37 #if USE(APPLE_INTERNAL_SDK)38 #include <System/pthread_machdep.h>39 #endif40 41 #if defined(__PTK_FRAMEWORK_JAVASCRIPTCORE_KEY1)42 #define USE_PTHREAD_GETSPECIFIC_DIRECT 143 #endif44 45 #if !USE(PTHREAD_GETSPECIFIC_DIRECT)46 36 #include <wtf/ThreadSpecific.h> 47 37 #include <wtf/Threading.h> 48 # endif38 #include <wtf/text/StringHash.h> 49 39 50 40 namespace WTF { … … 123 113 void* m_savedLastStackTop; 124 114 125 #if USE(PTHREAD_GETSPECIFIC_DIRECT) 126 static const pthread_key_t directKey = __PTK_FRAMEWORK_JAVASCRIPTCORE_KEY1; 115 #if HAVE(FAST_TLS) 127 116 WTF_EXPORT_PRIVATE static WTFThreadData& createAndRegisterForGetspecificDirect(); 128 117 #else … … 142 131 // wtfThreadData() is initially called from initializeThreading(), ensuring 143 132 // this is initially called in a pthread_once locked context. 144 #if ! USE(PTHREAD_GETSPECIFIC_DIRECT)133 #if !HAVE(FAST_TLS) 145 134 if (!WTFThreadData::staticData) 146 135 WTFThreadData::staticData = new ThreadSpecific<WTFThreadData>; 147 136 return **WTFThreadData::staticData; 148 137 #else 149 if (WTFThreadData* data = static_cast<WTFThreadData*>(_pthread_getspecific_direct(WTF ThreadData::directKey)))138 if (WTFThreadData* data = static_cast<WTFThreadData*>(_pthread_getspecific_direct(WTF_THREAD_DATA_KEY))) 150 139 return *data; 151 140 return WTFThreadData::createAndRegisterForGetspecificDirect();
Note: See TracChangeset
for help on using the changeset viewer.