Changeset 168729 in webkit
- Timestamp:
- May 13, 2014 1:57:07 PM (10 years ago)
- Location:
- trunk/Source/JavaScriptCore
- Files:
-
- 14 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/JavaScriptCore/ChangeLog
r168649 r168729 1 2014-05-13 peavo@outlook.com <peavo@outlook.com> 2 3 [Win] Enum type with value zero is compatible with void*, potential cause of crashes. 4 https://bugs.webkit.org/show_bug.cgi?id=132772 5 6 Reviewed by Geoffrey Garen. 7 8 Using the MSVC compiler, an instance of an enum type with value zero, is compatible with void* (see bug 132683 for a code example). 9 This has caused crashes on Windows on two occasions (bug 132683, and bug 121001). 10 This patch tries to prevent these type of crashes by using a type with explicit constructors instead of void*. 11 The void* parameter in the loadDouble and storeDouble methods are replaced with TrustedImmPtr. 12 13 * assembler/MacroAssemblerARM.h: 14 (JSC::MacroAssemblerARM::loadDouble): 15 (JSC::MacroAssemblerARM::storeDouble): 16 * assembler/MacroAssemblerARM64.h: 17 (JSC::MacroAssemblerARM64::loadDouble): 18 (JSC::MacroAssemblerARM64::storeDouble): 19 * assembler/MacroAssemblerARMv7.h: 20 (JSC::MacroAssemblerARMv7::loadDouble): 21 (JSC::MacroAssemblerARMv7::storeDouble): 22 * assembler/MacroAssemblerMIPS.h: 23 (JSC::MacroAssemblerMIPS::loadDouble): 24 (JSC::MacroAssemblerMIPS::storeDouble): 25 * assembler/MacroAssemblerSH4.h: 26 (JSC::MacroAssemblerSH4::loadDouble): 27 (JSC::MacroAssemblerSH4::storeDouble): 28 * assembler/MacroAssemblerX86.h: 29 (JSC::MacroAssemblerX86::storeDouble): 30 * assembler/MacroAssemblerX86Common.h: 31 (JSC::MacroAssemblerX86Common::absDouble): 32 (JSC::MacroAssemblerX86Common::negateDouble): 33 (JSC::MacroAssemblerX86Common::loadDouble): 34 * dfg/DFGSpeculativeJIT.cpp: 35 (JSC::DFG::SpeculativeJIT::silentFill): 36 (JSC::DFG::compileClampDoubleToByte): 37 * dfg/DFGSpeculativeJIT32_64.cpp: 38 (JSC::DFG::SpeculativeJIT::fillSpeculateDouble): 39 (JSC::DFG::SpeculativeJIT::compile): 40 * jit/AssemblyHelpers.cpp: 41 (JSC::AssemblyHelpers::purifyNaN): 42 * jit/JITInlines.h: 43 (JSC::JIT::emitLoadDouble): 44 * jit/JITPropertyAccess.cpp: 45 (JSC::JIT::emitFloatTypedArrayGetByVal): 46 * jit/ThunkGenerators.cpp: 47 (JSC::floorThunkGenerator): 48 (JSC::roundThunkGenerator): 49 (JSC::powThunkGenerator): 50 1 51 2014-05-12 Commit Queue <commit-queue@webkit.org> 2 52 -
trunk/Source/JavaScriptCore/assembler/MacroAssemblerARM.h
r168649 r168729 1122 1122 } 1123 1123 1124 void loadDouble( const void*address, FPRegisterID dest)1125 { 1126 move(TrustedImm32(reinterpret_cast<ARMWord>(address )), ARMRegisters::S0);1124 void loadDouble(TrustedImmPtr address, FPRegisterID dest) 1125 { 1126 move(TrustedImm32(reinterpret_cast<ARMWord>(address.m_value)), ARMRegisters::S0); 1127 1127 m_assembler.doubleDtrUp(ARMAssembler::LoadDouble, dest, ARMRegisters::S0, 0); 1128 1128 } … … 1143 1143 } 1144 1144 1145 void storeDouble(FPRegisterID src, const void*address)1146 { 1147 move(TrustedImm32(reinterpret_cast<ARMWord>(address )), ARMRegisters::S0);1145 void storeDouble(FPRegisterID src, TrustedImmPtr address) 1146 { 1147 move(TrustedImm32(reinterpret_cast<ARMWord>(address.m_value)), ARMRegisters::S0); 1148 1148 m_assembler.dataTransferFloat(ARMAssembler::StoreDouble, src, ARMRegisters::S0, 0); 1149 1149 } … … 1173 1173 void addDouble(AbsoluteAddress address, FPRegisterID dest) 1174 1174 { 1175 loadDouble( address.m_ptr, ARMRegisters::SD0);1175 loadDouble(TrustedImmPtr(address.m_ptr), ARMRegisters::SD0); 1176 1176 addDouble(ARMRegisters::SD0, dest); 1177 1177 } -
trunk/Source/JavaScriptCore/assembler/MacroAssemblerARM64.h
r168649 r168729 1157 1157 void addDouble(AbsoluteAddress address, FPRegisterID dest) 1158 1158 { 1159 loadDouble( address.m_ptr, fpTempRegister);1159 loadDouble(TrustedImmPtr(address.m_ptr), fpTempRegister); 1160 1160 addDouble(fpTempRegister, dest); 1161 1161 } … … 1311 1311 } 1312 1312 1313 void loadDouble( const void*address, FPRegisterID dest)1314 { 1315 moveToCachedReg( TrustedImmPtr(address), m_cachedMemoryTempRegister);1313 void loadDouble(TrustedImmPtr address, FPRegisterID dest) 1314 { 1315 moveToCachedReg(address, m_cachedMemoryTempRegister); 1316 1316 m_assembler.ldr<64>(dest, memoryTempRegister, ARM64Registers::zr); 1317 1317 } … … 1379 1379 } 1380 1380 1381 void storeDouble(FPRegisterID src, const void*address)1382 { 1383 moveToCachedReg( TrustedImmPtr(address), m_cachedMemoryTempRegister);1381 void storeDouble(FPRegisterID src, TrustedImmPtr address) 1382 { 1383 moveToCachedReg(address, m_cachedMemoryTempRegister); 1384 1384 m_assembler.str<64>(src, memoryTempRegister, ARM64Registers::zr); 1385 1385 } -
trunk/Source/JavaScriptCore/assembler/MacroAssemblerARMv7.h
r168649 r168729 876 876 } 877 877 878 void loadDouble( const void*address, FPRegisterID dest)879 { 880 move( TrustedImmPtr(address), addressTempRegister);878 void loadDouble(TrustedImmPtr address, FPRegisterID dest) 879 { 880 move(address, addressTempRegister); 881 881 m_assembler.vldr(dest, addressTempRegister, 0); 882 882 } … … 912 912 } 913 913 914 void storeDouble(FPRegisterID src, const void*address)915 { 916 move( TrustedImmPtr(address), addressTempRegister);914 void storeDouble(FPRegisterID src, TrustedImmPtr address) 915 { 916 move(address, addressTempRegister); 917 917 storeDouble(src, addressTempRegister); 918 918 } … … 952 952 void addDouble(AbsoluteAddress address, FPRegisterID dest) 953 953 { 954 loadDouble( address.m_ptr, fpTempRegister);954 loadDouble(TrustedImmPtr(address.m_ptr), fpTempRegister); 955 955 m_assembler.vadd(dest, dest, fpTempRegister); 956 956 } -
trunk/Source/JavaScriptCore/assembler/MacroAssemblerMIPS.h
r168649 r168729 2269 2269 } 2270 2270 2271 void loadDouble( const void*address, FPRegisterID dest)2271 void loadDouble(TrustedImmPtr address, FPRegisterID dest) 2272 2272 { 2273 2273 #if WTF_MIPS_ISA(1) … … 2277 2277 lwc1 dest+1, 4(addrTemp) 2278 2278 */ 2279 move( TrustedImmPtr(address), addrTempRegister);2279 move(address, addrTempRegister); 2280 2280 m_assembler.lwc1(dest, addrTempRegister, 0); 2281 2281 m_assembler.lwc1(FPRegisterID(dest + 1), addrTempRegister, 4); … … 2285 2285 ldc1 dest, 0(addrTemp) 2286 2286 */ 2287 move( TrustedImmPtr(address), addrTempRegister);2287 move(address, addrTempRegister); 2288 2288 m_assembler.ldc1(dest, addrTempRegister, 0); 2289 2289 #endif … … 2407 2407 } 2408 2408 2409 void storeDouble(FPRegisterID src, const void*address)2409 void storeDouble(FPRegisterID src, TrustedImmPtr address) 2410 2410 { 2411 2411 #if WTF_MIPS_ISA(1) 2412 move( TrustedImmPtr(address), addrTempRegister);2412 move(address, addrTempRegister); 2413 2413 m_assembler.swc1(src, addrTempRegister, 0); 2414 2414 m_assembler.swc1(FPRegisterID(src + 1), addrTempRegister, 4); 2415 2415 #else 2416 move( TrustedImmPtr(address), addrTempRegister);2416 move(address, addrTempRegister); 2417 2417 m_assembler.sdc1(src, addrTempRegister, 0); 2418 2418 #endif … … 2450 2450 void addDouble(AbsoluteAddress address, FPRegisterID dest) 2451 2451 { 2452 loadDouble( address.m_ptr, fpTempRegister);2452 loadDouble(TrustedImmPtr(address.m_ptr), fpTempRegister); 2453 2453 m_assembler.addd(dest, dest, fpTempRegister); 2454 2454 } -
trunk/Source/JavaScriptCore/assembler/MacroAssemblerSH4.h
r168649 r168729 1156 1156 } 1157 1157 1158 void loadDouble( const void*address, FPRegisterID dest)1159 { 1160 RegisterID scr = claimScratch(); 1161 move( TrustedImmPtr(address), scr);1158 void loadDouble(TrustedImmPtr address, FPRegisterID dest) 1159 { 1160 RegisterID scr = claimScratch(); 1161 move(address, scr); 1162 1162 m_assembler.fmovsReadrminc(scr, (FPRegisterID)(dest + 1)); 1163 1163 m_assembler.fmovsReadrm(scr, dest); … … 1205 1205 } 1206 1206 1207 void storeDouble(FPRegisterID src, const void*address)1208 { 1209 RegisterID scr = claimScratch(); 1210 m_assembler.loadConstant(reinterpret_cast<uint32_t>(const_cast<void*>(address )) + 8, scr);1207 void storeDouble(FPRegisterID src, TrustedImmPtr address) 1208 { 1209 RegisterID scr = claimScratch(); 1210 m_assembler.loadConstant(reinterpret_cast<uint32_t>(const_cast<void*>(address.m_value)) + 8, scr); 1211 1211 m_assembler.fmovsWriterndec(src, scr); 1212 1212 m_assembler.fmovsWriterndec((FPRegisterID)(src + 1), scr); … … 1221 1221 void addDouble(AbsoluteAddress address, FPRegisterID dest) 1222 1222 { 1223 loadDouble( address.m_ptr, fscratch);1223 loadDouble(TrustedImmPtr(address.m_ptr), fscratch); 1224 1224 addDouble(fscratch, dest); 1225 1225 } -
trunk/Source/JavaScriptCore/assembler/MacroAssemblerX86.h
r168649 r168729 124 124 } 125 125 126 void storeDouble(FPRegisterID src, const void*address)126 void storeDouble(FPRegisterID src, TrustedImmPtr address) 127 127 { 128 128 ASSERT(isSSE2Present()); 129 ASSERT(address );130 m_assembler.movsd_rm(src, address );129 ASSERT(address.m_value); 130 m_assembler.movsd_rm(src, address.m_value); 131 131 } 132 132 -
trunk/Source/JavaScriptCore/assembler/MacroAssemblerX86Common.h
r168649 r168729 449 449 ASSERT(src != dst); 450 450 static const double negativeZeroConstant = -0.0; 451 loadDouble( &negativeZeroConstant, dst);451 loadDouble(TrustedImmPtr(&negativeZeroConstant), dst); 452 452 m_assembler.andnpd_rr(src, dst); 453 453 } … … 457 457 ASSERT(src != dst); 458 458 static const double negativeZeroConstant = -0.0; 459 loadDouble( &negativeZeroConstant, dst);459 loadDouble(TrustedImmPtr(&negativeZeroConstant), dst); 460 460 m_assembler.xorpd_rr(src, dst); 461 461 } … … 685 685 } 686 686 687 void loadDouble( const void*address, FPRegisterID dest)687 void loadDouble(TrustedImmPtr address, FPRegisterID dest) 688 688 { 689 689 #if CPU(X86) 690 690 ASSERT(isSSE2Present()); 691 m_assembler.movsd_mr(address , dest);691 m_assembler.movsd_mr(address.m_value, dest); 692 692 #else 693 move( TrustedImmPtr(address), scratchRegister);693 move(address, scratchRegister); 694 694 loadDouble(scratchRegister, dest); 695 695 #endif -
trunk/Source/JavaScriptCore/dfg/DFGSpeculativeJIT.cpp
r168649 r168729 554 554 break; 555 555 case SetDoubleConstant: 556 m_jit.loadDouble( addressOfDoubleConstant(plan.node()), plan.fpr());556 m_jit.loadDouble(TrustedImmPtr(addressOfDoubleConstant(plan.node())), plan.fpr()); 557 557 break; 558 558 #endif … … 2255 2255 static const double byteMax = 255; 2256 2256 static const double half = 0.5; 2257 jit.loadDouble( &zero, scratch);2257 jit.loadDouble(MacroAssembler::TrustedImmPtr(&zero), scratch); 2258 2258 MacroAssembler::Jump tooSmall = jit.branchDouble(MacroAssembler::DoubleLessThanOrEqualOrUnordered, source, scratch); 2259 jit.loadDouble( &byteMax, scratch);2259 jit.loadDouble(MacroAssembler::TrustedImmPtr(&byteMax), scratch); 2260 2260 MacroAssembler::Jump tooBig = jit.branchDouble(MacroAssembler::DoubleGreaterThan, source, scratch); 2261 2261 2262 jit.loadDouble( &half, scratch);2262 jit.loadDouble(MacroAssembler::TrustedImmPtr(&half), scratch); 2263 2263 // FIXME: This should probably just use a floating point round! 2264 2264 // https://bugs.webkit.org/show_bug.cgi?id=72054 -
trunk/Source/JavaScriptCore/dfg/DFGSpeculativeJIT32_64.cpp
r168649 r168729 837 837 RELEASE_ASSERT(isNumberConstant(edge.node())); 838 838 FPRReg fpr = fprAllocate(); 839 m_jit.loadDouble( addressOfDoubleConstant(edge.node()), fpr);839 m_jit.loadDouble(TrustedImmPtr(addressOfDoubleConstant(edge.node())), fpr); 840 840 m_fprs.retain(fpr, virtualRegister, SpillOrderConstant); 841 841 info.fillDouble(*m_stream, fpr); … … 3127 3127 m_jit.branchDouble(MacroAssembler::DoubleNotEqualOrUnordered, opFPR, opFPR)); 3128 3128 3129 m_jit.storeDouble(opFPR, reinterpret_cast<char*>(buffer + operandIdx));3129 m_jit.storeDouble(opFPR, TrustedImmPtr(reinterpret_cast<char*>(buffer + operandIdx))); 3130 3130 break; 3131 3131 } -
trunk/Source/JavaScriptCore/jit/AssemblyHelpers.cpp
r168649 r168729 59 59 MacroAssembler::Jump notNaN = branchDouble(DoubleEqual, fpr, fpr); 60 60 static const double NaN = PNaN; 61 loadDouble( &NaN, fpr);61 loadDouble(TrustedImmPtr(&NaN), fpr); 62 62 notNaN.link(this); 63 63 } -
trunk/Source/JavaScriptCore/jit/JITInlines.h
r168649 r168729 817 817 if (m_codeBlock->isConstantRegisterIndex(index)) { 818 818 WriteBarrier<Unknown>& inConstantPool = m_codeBlock->constantRegister(index); 819 loadDouble( &inConstantPool, value);819 loadDouble(TrustedImmPtr(&inConstantPool), value); 820 820 } else 821 821 loadDouble(addressFor(index), value); … … 1017 1017 if (m_codeBlock->isConstantRegisterIndex(index)) { 1018 1018 WriteBarrier<Unknown>& inConstantPool = m_codeBlock->constantRegister(index); 1019 loadDouble( &inConstantPool, value);1019 loadDouble(TrustedImmPtr(&inConstantPool), value); 1020 1020 } else 1021 1021 loadDouble(addressFor(index), value); -
trunk/Source/JavaScriptCore/jit/JITPropertyAccess.cpp
r168649 r168729 1241 1241 Jump notNaN = branchDouble(DoubleEqual, fpRegT0, fpRegT0); 1242 1242 static const double NaN = PNaN; 1243 loadDouble( &NaN, fpRegT0);1243 loadDouble(TrustedImmPtr(&NaN), fpRegT0); 1244 1244 notNaN.link(this); 1245 1245 -
trunk/Source/JavaScriptCore/jit/ThunkGenerators.cpp
r168649 r168729 741 741 SpecializedThunkJIT::JumpList doubleResult; 742 742 if (jit.supportsFloatingPointTruncate()) { 743 jit.loadDouble( &zeroConstant, SpecializedThunkJIT::fpRegT1);743 jit.loadDouble(MacroAssembler::TrustedImmPtr(&zeroConstant), SpecializedThunkJIT::fpRegT1); 744 744 doubleResult.append(jit.branchDouble(MacroAssembler::DoubleEqual, SpecializedThunkJIT::fpRegT0, SpecializedThunkJIT::fpRegT1)); 745 745 SpecializedThunkJIT::JumpList slowPath; … … 797 797 SpecializedThunkJIT::JumpList doubleResult; 798 798 if (jit.supportsFloatingPointTruncate()) { 799 jit.loadDouble( &zeroConstant, SpecializedThunkJIT::fpRegT1);799 jit.loadDouble(MacroAssembler::TrustedImmPtr(&zeroConstant), SpecializedThunkJIT::fpRegT1); 800 800 doubleResult.append(jit.branchDouble(MacroAssembler::DoubleEqual, SpecializedThunkJIT::fpRegT0, SpecializedThunkJIT::fpRegT1)); 801 801 SpecializedThunkJIT::JumpList slowPath; 802 802 // Handle the negative doubles in the slow path for now. 803 803 slowPath.append(jit.branchDouble(MacroAssembler::DoubleLessThanOrUnordered, SpecializedThunkJIT::fpRegT0, SpecializedThunkJIT::fpRegT1)); 804 jit.loadDouble( &halfConstant, SpecializedThunkJIT::fpRegT1);804 jit.loadDouble(MacroAssembler::TrustedImmPtr(&halfConstant), SpecializedThunkJIT::fpRegT1); 805 805 jit.addDouble(SpecializedThunkJIT::fpRegT0, SpecializedThunkJIT::fpRegT1); 806 806 slowPath.append(jit.branchTruncateDoubleToInt32(SpecializedThunkJIT::fpRegT1, SpecializedThunkJIT::regT0)); … … 870 870 return MacroAssemblerCodeRef::createSelfManagedCodeRef(vm->jitStubs->ctiNativeCall(vm)); 871 871 872 jit.loadDouble( &oneConstant, SpecializedThunkJIT::fpRegT1);872 jit.loadDouble(MacroAssembler::TrustedImmPtr(&oneConstant), SpecializedThunkJIT::fpRegT1); 873 873 jit.loadDoubleArgument(0, SpecializedThunkJIT::fpRegT0, SpecializedThunkJIT::regT0); 874 874 MacroAssembler::Jump nonIntExponent; … … 898 898 if (jit.supportsFloatingPointSqrt()) { 899 899 nonIntExponent.link(&jit); 900 jit.loadDouble( &negativeHalfConstant, SpecializedThunkJIT::fpRegT3);900 jit.loadDouble(MacroAssembler::TrustedImmPtr(&negativeHalfConstant), SpecializedThunkJIT::fpRegT3); 901 901 jit.loadDoubleArgument(1, SpecializedThunkJIT::fpRegT2, SpecializedThunkJIT::regT0); 902 902 jit.appendFailure(jit.branchDouble(MacroAssembler::DoubleLessThanOrEqual, SpecializedThunkJIT::fpRegT0, SpecializedThunkJIT::fpRegT1));
Note: See TracChangeset
for help on using the changeset viewer.