Changeset 192345 in webkit
- Timestamp:
- Nov 11, 2015 7:39:00 PM (8 years ago)
- Location:
- trunk/Source/JavaScriptCore
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/JavaScriptCore/ChangeLog
r192334 r192345 1 2015-11-11 Filip Pizlo <fpizlo@apple.com> 2 3 Patchpoints with stackArgument constraints should work 4 https://bugs.webkit.org/show_bug.cgi?id=151177 5 6 Reviewed by Saam Barati. 7 8 The only thing broken was that StackmapSpecial's isValidForm would reject Arg::addr, so 9 validation would fail after allocateStack. 10 11 In order for StackmapSpecial to validate Arg::addr, it needs to know the frame size. To know 12 the frame size, it needs access to Code&. So, this changes Air::Special to always have a 13 pointer back to Code. 14 15 Other than this already worked. 16 17 * b3/B3StackmapSpecial.cpp: 18 (JSC::B3::StackmapSpecial::isValidImpl): 19 * b3/air/AirCode.cpp: 20 (JSC::B3::Air::Code::addSpecial): 21 * b3/air/AirSpecial.cpp: 22 (JSC::B3::Air::Special::Special): 23 * b3/air/AirSpecial.h: 24 (JSC::B3::Air::Special::code): 25 * b3/testb3.cpp: 26 (JSC::B3::testSimplePatchpoint): 27 (JSC::B3::testPatchpointCallArg): 28 (JSC::B3::testSimpleCheck): 29 (JSC::B3::run): 30 1 31 2015-11-11 Mark Lam <mark.lam@apple.com> 2 32 -
trunk/Source/JavaScriptCore/b3/B3StackmapSpecial.cpp
r191993 r192345 152 152 break; 153 153 case ValueRep::StackArgument: 154 if (arg != Arg::callArg(rep.offsetFromSP())) 155 return false; 156 break; 154 if (arg == Arg::callArg(rep.offsetFromSP())) 155 break; 156 if (arg.isAddr() && code().frameSize()) { 157 if (arg.base() == Tmp(GPRInfo::callFrameRegister) 158 && arg.offset() == rep.offsetFromSP() - code().frameSize()) 159 break; 160 if (arg.base() == Tmp(MacroAssembler::stackPointerRegister) 161 && arg.offset() == rep.offsetFromSP()) 162 break; 163 } 164 return false; 157 165 case ValueRep::Constant: 158 166 // This is not a valid input representation. -
trunk/Source/JavaScriptCore/b3/air/AirCode.cpp
r192183 r192345 69 69 { 70 70 Special* result = special.get(); 71 result->m_code = this; 71 72 m_specials.append(WTF::move(special)); 72 73 return result; -
trunk/Source/JavaScriptCore/b3/air/AirSpecial.cpp
r191952 r192345 38 38 Special::Special() 39 39 : m_index(UINT_MAX) 40 , m_code(nullptr) 40 41 { 41 42 } -
trunk/Source/JavaScriptCore/b3/air/AirSpecial.h
r191846 r192345 37 37 namespace JSC { namespace B3 { namespace Air { 38 38 39 class Code; 39 40 struct GenerationContext; 40 41 … … 47 48 Special(); 48 49 virtual ~Special(); 50 51 Code& code() const { return *m_code; } 49 52 50 53 CString name() const; … … 98 101 const char* m_name; 99 102 unsigned m_index; 103 Code* m_code; 100 104 }; 101 105 -
trunk/Source/JavaScriptCore/b3/testb3.cpp
r192320 r192345 2572 2572 jit.move(params.reps[1].gpr(), params.reps[0].gpr()); 2573 2573 jit.add32(params.reps[2].gpr(), params.reps[0].gpr()); 2574 }); 2575 root->appendNew<ControlValue>(proc, Return, Origin(), patchpoint); 2576 2577 CHECK(compileAndRun<int>(proc, 1, 2) == 3); 2578 } 2579 2580 void testPatchpointCallArg() 2581 { 2582 Procedure proc; 2583 BasicBlock* root = proc.addBlock(); 2584 Value* arg1 = root->appendNew<ArgumentRegValue>(proc, Origin(), GPRInfo::argumentGPR0); 2585 Value* arg2 = root->appendNew<ArgumentRegValue>(proc, Origin(), GPRInfo::argumentGPR1); 2586 PatchpointValue* patchpoint = root->appendNew<PatchpointValue>(proc, Int32, Origin()); 2587 patchpoint->append(ConstrainedValue(arg1, ValueRep::stackArgument(0))); 2588 patchpoint->append(ConstrainedValue(arg2, ValueRep::stackArgument(8))); 2589 patchpoint->setGenerator( 2590 [&] (CCallHelpers& jit, const StackmapGenerationParams& params) { 2591 CHECK(params.reps.size() == 3); 2592 CHECK(params.reps[0].isGPR()); 2593 CHECK(params.reps[1].isStack()); 2594 CHECK(params.reps[2].isStack()); 2595 jit.load32( 2596 CCallHelpers::Address(GPRInfo::callFrameRegister, params.reps[1].offsetFromFP()), 2597 params.reps[0].gpr()); 2598 jit.add32( 2599 CCallHelpers::Address(GPRInfo::callFrameRegister, params.reps[2].offsetFromFP()), 2600 params.reps[0].gpr()); 2574 2601 }); 2575 2602 root->appendNew<ControlValue>(proc, Return, Origin(), patchpoint); … … 3607 3634 3608 3635 RUN(testSimplePatchpoint()); 3636 RUN(testPatchpointCallArg()); 3609 3637 RUN(testSimpleCheck()); 3610 3638 RUN(testCheckLessThan());
Note: See TracChangeset
for help on using the changeset viewer.