Changeset 220720 in webkit
- Timestamp:
- Aug 14, 2017 3:55:31 PM (7 years ago)
- Location:
- trunk/Source/JavaScriptCore
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/JavaScriptCore/ChangeLog
r220712 r220720 1 2017-08-14 Mark Lam <mark.lam@apple.com> 2 3 Add some convenience utility accessor methods to MacroAssembler::CPUState. 4 https://bugs.webkit.org/show_bug.cgi?id=175549 5 <rdar://problem/33884868> 6 7 Reviewed by Saam Barati. 8 9 Previously, in order to read ProbeContext CPUState registers, we used to need to 10 do it this way: 11 12 ExecState* exec = reinterpret_cast<ExecState*>(cpu.fp()); 13 uint32_t i32 = static_cast<uint32_t>(cpu.gpr(GPRInfo::regT0)); 14 void* p = reinterpret_cast<void*>(cpu.gpr(GPRInfo::regT1)); 15 uint64_t u64 = bitwise_cast<uint64_t>(cpu.fpr(FPRInfo::fpRegT0)); 16 17 With this patch, we can now read them this way instead: 18 19 ExecState* exec = cpu.fp<ExecState*>(); 20 uint32_t i32 = cpu.gpr<uint32_t>(GPRInfo::regT0); 21 void* p = cpu.gpr<void*>(GPRInfo::regT1); 22 uint64_t u64 = cpu.fpr<uint64_t>(FPRInfo::fpRegT0); 23 24 * assembler/MacroAssembler.h: 25 (JSC:: const): 26 (JSC::MacroAssembler::CPUState::fpr const): 27 (JSC::MacroAssembler::CPUState::pc const): 28 (JSC::MacroAssembler::CPUState::fp const): 29 (JSC::MacroAssembler::CPUState::sp const): 30 (JSC::ProbeContext::pc): 31 (JSC::ProbeContext::fp): 32 (JSC::ProbeContext::sp): 33 1 34 2017-08-12 Filip Pizlo <fpizlo@apple.com> 2 35 -
trunk/Source/JavaScriptCore/assembler/MacroAssembler.h
r220579 r220720 1864 1864 inline uintptr_t& spr(SPRegisterID); 1865 1865 inline double& fpr(FPRegisterID); 1866 1867 inline void*& pc(); 1868 inline void*& fp(); 1869 inline void*& sp(); 1870 1866 1867 template<typename T, typename std::enable_if<std::is_integral<T>::value>::type* = nullptr> 1868 T gpr(RegisterID) const; 1869 template<typename T, typename std::enable_if<std::is_pointer<T>::value>::type* = nullptr> 1870 T gpr(RegisterID) const; 1871 template<typename T> T fpr(FPRegisterID) const; 1872 1873 void*& pc(); 1874 void*& fp(); 1875 void*& sp(); 1876 template<typename T> T pc() const; 1877 template<typename T> T fp() const; 1878 template<typename T> T sp() const; 1879 1871 1880 uintptr_t gprs[MacroAssembler::numberOfRegisters()]; 1872 1881 uintptr_t sprs[MacroAssembler::numberOfSPRegisters()]; … … 1890 1899 ASSERT(id >= MacroAssembler::firstFPRegister() && id <= MacroAssembler::lastFPRegister()); 1891 1900 return fprs[id]; 1901 } 1902 1903 template<typename T, typename std::enable_if<std::is_integral<T>::value>::type*> 1904 T MacroAssembler::CPUState::gpr(RegisterID id) const 1905 { 1906 CPUState* cpu = const_cast<CPUState*>(this); 1907 return static_cast<T>(cpu->gpr(id)); 1908 } 1909 1910 template<typename T, typename std::enable_if<std::is_pointer<T>::value>::type*> 1911 T MacroAssembler::CPUState::gpr(RegisterID id) const 1912 { 1913 CPUState* cpu = const_cast<CPUState*>(this); 1914 return reinterpret_cast<T>(cpu->gpr(id)); 1915 } 1916 1917 template<typename T> 1918 T MacroAssembler::CPUState::fpr(FPRegisterID id) const 1919 { 1920 CPUState* cpu = const_cast<CPUState*>(this); 1921 return bitwise_cast<T>(cpu->fpr(id)); 1892 1922 } 1893 1923 … … 1937 1967 } 1938 1968 1969 template<typename T> 1970 T MacroAssembler::CPUState::pc() const 1971 { 1972 CPUState* cpu = const_cast<CPUState*>(this); 1973 return reinterpret_cast<T>(cpu->pc()); 1974 } 1975 1976 template<typename T> 1977 T MacroAssembler::CPUState::fp() const 1978 { 1979 CPUState* cpu = const_cast<CPUState*>(this); 1980 return reinterpret_cast<T>(cpu->fp()); 1981 } 1982 1983 template<typename T> 1984 T MacroAssembler::CPUState::sp() const 1985 { 1986 CPUState* cpu = const_cast<CPUState*>(this); 1987 return reinterpret_cast<T>(cpu->sp()); 1988 } 1989 1939 1990 struct ProbeContext { 1940 1991 using CPUState = MacroAssembler::CPUState; … … 1958 2009 void*& fp() { return cpu.fp(); } 1959 2010 void*& sp() { return cpu.sp(); } 2011 2012 template<typename T> T pc() { return cpu.pc<T>(); } 2013 template<typename T> T fp() { return cpu.fp<T>(); } 2014 template<typename T> T sp() { return cpu.sp<T>(); } 1960 2015 }; 1961 2016
Note: See TracChangeset
for help on using the changeset viewer.