Move Probe code from AbstractMacroAssembler to MacroAssembler.
authormark.lam@apple.com <mark.lam@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 12 Jul 2017 23:50:01 +0000 (23:50 +0000)
committermark.lam@apple.com <mark.lam@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 12 Jul 2017 23:50:01 +0000 (23:50 +0000)
https://bugs.webkit.org/show_bug.cgi?id=174441

Reviewed by Saam Barati.

This is a pure refactoring patch for moving probe code from the AbstractMacroAssembler
to MacroAssembler.  There is no code behavior change.

* assembler/AbstractMacroAssembler.h:
(JSC::AbstractMacroAssembler<AssemblerType>::Address::indexedBy):
(JSC::AbstractMacroAssembler::CPUState::gprName): Deleted.
(JSC::AbstractMacroAssembler::CPUState::fprName): Deleted.
(JSC::AbstractMacroAssembler::CPUState::gpr): Deleted.
(JSC::AbstractMacroAssembler::CPUState::fpr): Deleted.
(JSC::MacroAssemblerType>::Address::indexedBy): Deleted.
* assembler/MacroAssembler.h:
(JSC::MacroAssembler::CPUState::gprName):
(JSC::MacroAssembler::CPUState::fprName):
(JSC::MacroAssembler::CPUState::gpr):
(JSC::MacroAssembler::CPUState::fpr):
* assembler/MacroAssemblerARM.cpp:
(JSC::MacroAssembler::probe):
(JSC::MacroAssemblerARM::probe): Deleted.
* assembler/MacroAssemblerARM.h:
* assembler/MacroAssemblerARM64.cpp:
(JSC::MacroAssembler::probe):
(JSC::MacroAssemblerARM64::probe): Deleted.
* assembler/MacroAssemblerARM64.h:
* assembler/MacroAssemblerARMv7.cpp:
(JSC::MacroAssembler::probe):
(JSC::MacroAssemblerARMv7::probe): Deleted.
* assembler/MacroAssemblerARMv7.h:
* assembler/MacroAssemblerMIPS.h:
* assembler/MacroAssemblerX86Common.cpp:
(JSC::MacroAssembler::probe):
(JSC::MacroAssemblerX86Common::probe): Deleted.
* assembler/MacroAssemblerX86Common.h:

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@219434 268f45cc-cd09-0410-ab3c-d52691b4dbfc

12 files changed:
Source/JavaScriptCore/ChangeLog
Source/JavaScriptCore/assembler/AbstractMacroAssembler.h
Source/JavaScriptCore/assembler/MacroAssembler.h
Source/JavaScriptCore/assembler/MacroAssemblerARM.cpp
Source/JavaScriptCore/assembler/MacroAssemblerARM.h
Source/JavaScriptCore/assembler/MacroAssemblerARM64.cpp
Source/JavaScriptCore/assembler/MacroAssemblerARM64.h
Source/JavaScriptCore/assembler/MacroAssemblerARMv7.cpp
Source/JavaScriptCore/assembler/MacroAssemblerARMv7.h
Source/JavaScriptCore/assembler/MacroAssemblerMIPS.h
Source/JavaScriptCore/assembler/MacroAssemblerX86Common.cpp
Source/JavaScriptCore/assembler/MacroAssemblerX86Common.h

index f97f20f..c0032bc 100644 (file)
@@ -1,3 +1,43 @@
+2017-07-12  Mark Lam  <mark.lam@apple.com>
+
+        Move Probe code from AbstractMacroAssembler to MacroAssembler.
+        https://bugs.webkit.org/show_bug.cgi?id=174441
+
+        Reviewed by Saam Barati.
+
+        This is a pure refactoring patch for moving probe code from the AbstractMacroAssembler
+        to MacroAssembler.  There is no code behavior change.
+
+        * assembler/AbstractMacroAssembler.h:
+        (JSC::AbstractMacroAssembler<AssemblerType>::Address::indexedBy):
+        (JSC::AbstractMacroAssembler::CPUState::gprName): Deleted.
+        (JSC::AbstractMacroAssembler::CPUState::fprName): Deleted.
+        (JSC::AbstractMacroAssembler::CPUState::gpr): Deleted.
+        (JSC::AbstractMacroAssembler::CPUState::fpr): Deleted.
+        (JSC::MacroAssemblerType>::Address::indexedBy): Deleted.
+        * assembler/MacroAssembler.h:
+        (JSC::MacroAssembler::CPUState::gprName):
+        (JSC::MacroAssembler::CPUState::fprName):
+        (JSC::MacroAssembler::CPUState::gpr):
+        (JSC::MacroAssembler::CPUState::fpr):
+        * assembler/MacroAssemblerARM.cpp:
+        (JSC::MacroAssembler::probe):
+        (JSC::MacroAssemblerARM::probe): Deleted.
+        * assembler/MacroAssemblerARM.h:
+        * assembler/MacroAssemblerARM64.cpp:
+        (JSC::MacroAssembler::probe):
+        (JSC::MacroAssemblerARM64::probe): Deleted.
+        * assembler/MacroAssemblerARM64.h:
+        * assembler/MacroAssemblerARMv7.cpp:
+        (JSC::MacroAssembler::probe):
+        (JSC::MacroAssemblerARMv7::probe): Deleted.
+        * assembler/MacroAssemblerARMv7.h:
+        * assembler/MacroAssemblerMIPS.h:
+        * assembler/MacroAssemblerX86Common.cpp:
+        (JSC::MacroAssembler::probe):
+        (JSC::MacroAssemblerX86Common::probe): Deleted.
+        * assembler/MacroAssemblerX86Common.h:
+
 2017-07-12  Saam Barati  <sbarati@apple.com>
 
         GenericArguments consults the wrong state when tracking modified argument descriptors and mapped arguments
index 2eb451d..6bd459b 100644 (file)
@@ -76,10 +76,10 @@ public:
     }
 };
 
-template <class AssemblerType, class MacroAssemblerType>
+template <class AssemblerType>
 class AbstractMacroAssembler : public AbstractMacroAssemblerBase {
 public:
-    typedef AbstractMacroAssembler<AssemblerType, MacroAssemblerType> AbstractMacroAssemblerType;
+    typedef AbstractMacroAssembler<AssemblerType> AbstractMacroAssemblerType;
     typedef AssemblerType AssemblerType_T;
 
     typedef MacroAssemblerCodePtr CodePtr;
@@ -371,8 +371,7 @@ public:
     // A Label records a point in the generated instruction stream, typically such that
     // it may be used as a destination for a jump.
     class Label {
-        template<class TemplateAssemblerType, class TemplateMacroAssemblerType>
-        friend class AbstractMacroAssembler;
+        friend class AbstractMacroAssembler<AssemblerType>;
         friend struct DFG::OSRExit;
         friend class Jump;
         friend class MacroAssemblerCodeRef;
@@ -408,8 +407,7 @@ public:
     //
     // addPtr(TrustedImmPtr(i), a, b)
     class ConvertibleLoadLabel {
-        template<class TemplateAssemblerType, class TemplateMacroAssemblerType>
-        friend class AbstractMacroAssembler;
+        friend class AbstractMacroAssembler<AssemblerType>;
         friend class LinkBuffer;
         
     public:
@@ -432,8 +430,7 @@ public:
     // A DataLabelPtr is used to refer to a location in the code containing a pointer to be
     // patched after the code has been generated.
     class DataLabelPtr {
-        template<class TemplateAssemblerType, class TemplateMacroAssemblerType>
-        friend class AbstractMacroAssembler;
+        friend class AbstractMacroAssembler<AssemblerType>;
         friend class LinkBuffer;
     public:
         DataLabelPtr()
@@ -456,8 +453,7 @@ public:
     // A DataLabel32 is used to refer to a location in the code containing a 32-bit constant to be
     // patched after the code has been generated.
     class DataLabel32 {
-        template<class TemplateAssemblerType, class TemplateMacroAssemblerType>
-        friend class AbstractMacroAssembler;
+        friend class AbstractMacroAssembler<AssemblerType>;
         friend class LinkBuffer;
     public:
         DataLabel32()
@@ -480,8 +476,7 @@ public:
     // A DataLabelCompact is used to refer to a location in the code containing a
     // compact immediate to be patched after the code has been generated.
     class DataLabelCompact {
-        template<class TemplateAssemblerType, class TemplateMacroAssemblerType>
-        friend class AbstractMacroAssembler;
+        friend class AbstractMacroAssembler<AssemblerType>;
         friend class LinkBuffer;
     public:
         DataLabelCompact()
@@ -511,8 +506,7 @@ public:
     // relative offset such that when executed it will call to the desired
     // destination.
     class Call {
-        template<class TemplateAssemblerType, class TemplateMacroAssemblerType>
-        friend class AbstractMacroAssembler;
+        friend class AbstractMacroAssembler<AssemblerType>;
 
     public:
         enum Flags {
@@ -557,8 +551,7 @@ public:
     // relative offset such that when executed it will jump to the desired
     // destination.
     class Jump {
-        template<class TemplateAssemblerType, class TemplateMacroAssemblerType>
-        friend class AbstractMacroAssembler;
+        friend class AbstractMacroAssembler<AssemblerType>;
         friend class Call;
         friend struct DFG::OSRExit;
         friend class LinkBuffer;
@@ -842,90 +835,6 @@ public:
         AssemblerType::cacheFlush(code, size);
     }
 
-#if ENABLE(MASM_PROBE)
-
-    struct CPUState {
-        #define DECLARE_REGISTER(_type, _regName) \
-            _type _regName;
-        FOR_EACH_CPU_REGISTER(DECLARE_REGISTER)
-        #undef DECLARE_REGISTER
-
-        static const char* gprName(RegisterID regID)
-        {
-            switch (regID) {
-                #define DECLARE_REGISTER(_type, _regName) \
-                case RegisterID::_regName: \
-                    return #_regName;
-                FOR_EACH_CPU_GPREGISTER(DECLARE_REGISTER)
-                #undef DECLARE_REGISTER
-            default:
-                RELEASE_ASSERT_NOT_REACHED();
-            }
-        }
-
-        static const char* fprName(FPRegisterID regID)
-        {
-            switch (regID) {
-                #define DECLARE_REGISTER(_type, _regName) \
-                case FPRegisterID::_regName: \
-                    return #_regName;
-                FOR_EACH_CPU_FPREGISTER(DECLARE_REGISTER)
-                #undef DECLARE_REGISTER
-            default:
-                RELEASE_ASSERT_NOT_REACHED();
-            }
-        }
-
-        void*& gpr(RegisterID regID)
-        {
-            switch (regID) {
-                #define DECLARE_REGISTER(_type, _regName) \
-                case RegisterID::_regName: \
-                    return _regName;
-                FOR_EACH_CPU_GPREGISTER(DECLARE_REGISTER)
-                #undef DECLARE_REGISTER
-            default:
-                RELEASE_ASSERT_NOT_REACHED();
-            }
-        }
-
-        double& fpr(FPRegisterID regID)
-        {
-            switch (regID) {
-                #define DECLARE_REGISTER(_type, _regName) \
-                case FPRegisterID::_regName: \
-                    return _regName;
-                FOR_EACH_CPU_FPREGISTER(DECLARE_REGISTER)
-                #undef DECLARE_REGISTER
-            default:
-                RELEASE_ASSERT_NOT_REACHED();
-            }
-        }
-    };
-
-    // This function emits code to preserve the CPUState (e.g. registers),
-    // call a user supplied probe function, and restore the CPUState before
-    // continuing with other JIT generated code.
-    //
-    // The user supplied probe function will be called with a single pointer to
-    // a ProbeContext struct (defined above) which contains, among other things,
-    // the preserved CPUState. This allows the user probe function to inspect
-    // the CPUState at that point in the JIT generated code.
-    //
-    // If the user probe function alters the register values in the ProbeContext,
-    // the altered values will be loaded into the CPU registers when the probe
-    // returns.
-    //
-    // The ProbeContext is stack allocated and is only valid for the duration
-    // of the call to the user probe function.
-    //
-    // Note: probe() should be implemented by the target specific MacroAssembler.
-    // This prototype is only provided here to document the interface.
-
-    void probe(ProbeFunction, void* arg);
-
-#endif // ENABLE(MASM_PROBE)
-
     AssemblerType m_assembler;
     
     static void linkJump(void* code, Jump jump, CodeLocationLabel target)
@@ -1127,11 +1036,11 @@ protected:
     friend class LinkBuffer;
 }; // class AbstractMacroAssembler
 
-template <class AssemblerType, class MacroAssemblerType>
-inline typename AbstractMacroAssembler<AssemblerType, MacroAssemblerType>::BaseIndex
-AbstractMacroAssembler<AssemblerType, MacroAssemblerType>::Address::indexedBy(
-    typename AbstractMacroAssembler<AssemblerType, MacroAssemblerType>::RegisterID index,
-    typename AbstractMacroAssembler<AssemblerType, MacroAssemblerType>::Scale scale) const
+template <class AssemblerType>
+inline typename AbstractMacroAssembler<AssemblerType>::BaseIndex
+AbstractMacroAssembler<AssemblerType>::Address::indexedBy(
+    typename AbstractMacroAssembler<AssemblerType>::RegisterID index,
+    typename AbstractMacroAssembler<AssemblerType>::Scale scale) const
 {
     return BaseIndex(base, index, scale, offset);
 }
index 6278456..2aea07e 100644 (file)
@@ -1835,10 +1835,30 @@ public:
     }
 
 #if ENABLE(MASM_PROBE)
-    using MacroAssemblerBase::probe;
+    struct CPUState;
+
+    // This function emits code to preserve the CPUState (e.g. registers),
+    // call a user supplied probe function, and restore the CPUState before
+    // continuing with other JIT generated code.
+    //
+    // The user supplied probe function will be called with a single pointer to
+    // a ProbeContext struct (defined below) which contains, among other things,
+    // the preserved CPUState. This allows the user probe function to inspect
+    // the CPUState at that point in the JIT generated code.
+    //
+    // If the user probe function alters the register values in the ProbeContext,
+    // the altered values will be loaded into the CPU registers when the probe
+    // returns.
+    //
+    // The ProbeContext is stack allocated and is only valid for the duration
+    // of the call to the user probe function.
+    //
+    // Note: this version of probe() should be implemented by the target specific
+    // MacroAssembler.
+    void probe(ProbeFunction, void* arg);
 
     void probe(std::function<void(ProbeContext*)>);
-#endif
+#endif // ENABLE(MASM_PROBE)
 
     // Let's you print from your JIT generated code.
     // This only works if ENABLE(MASM_PROBE). Otherwise, print() is a no-op.
@@ -1850,6 +1870,76 @@ public:
 };
 
 #if ENABLE(MASM_PROBE)
+
+#define DECLARE_REGISTER(_type, _regName) \
+    _type _regName;
+
+struct MacroAssembler::CPUState {
+    FOR_EACH_CPU_REGISTER(DECLARE_REGISTER)
+
+    static inline const char* gprName(RegisterID);
+    static inline const char* fprName(FPRegisterID);
+    inline void*& gpr(RegisterID);
+    inline double& fpr(FPRegisterID);
+};
+#undef DECLARE_REGISTER
+
+inline const char* MacroAssembler::CPUState::gprName(RegisterID regID)
+{
+#define DECLARE_REGISTER(_type, _regName) \
+    case RegisterID::_regName: \
+        return #_regName;
+
+    switch (regID) {
+        FOR_EACH_CPU_GPREGISTER(DECLARE_REGISTER)
+    default:
+        RELEASE_ASSERT_NOT_REACHED();
+    }
+#undef DECLARE_REGISTER
+}
+
+inline const char* MacroAssembler::CPUState::fprName(FPRegisterID regID)
+{
+#define DECLARE_REGISTER(_type, _regName) \
+    case FPRegisterID::_regName: \
+        return #_regName;
+
+    switch (regID) {
+        FOR_EACH_CPU_FPREGISTER(DECLARE_REGISTER)
+    default:
+        RELEASE_ASSERT_NOT_REACHED();
+    }
+#undef DECLARE_REGISTER
+}
+
+inline void*& MacroAssembler::CPUState::gpr(RegisterID regID)
+{
+#define DECLARE_REGISTER(_type, _regName) \
+    case RegisterID::_regName: \
+        return _regName;
+
+    switch (regID) {
+        FOR_EACH_CPU_GPREGISTER(DECLARE_REGISTER)
+    default:
+        RELEASE_ASSERT_NOT_REACHED();
+    }
+#undef DECLARE_REGISTER
+}
+
+inline double& MacroAssembler::CPUState::fpr(FPRegisterID regID)
+{
+#define DECLARE_REGISTER(_type, _regName) \
+    case FPRegisterID::_regName: \
+        return _regName;
+
+    switch (regID) {
+        FOR_EACH_CPU_FPREGISTER(DECLARE_REGISTER)
+    default:
+        RELEASE_ASSERT_NOT_REACHED();
+    }
+#undef DECLARE_REGISTER
+}
+
 struct ProbeContext {
     using CPUState = MacroAssembler::CPUState;
     using RegisterID = MacroAssembler::RegisterID;
index e509eb4..70c4970 100644 (file)
@@ -349,7 +349,7 @@ asm (
 );
 #endif // COMPILER(GCC_OR_CLANG)
 
-void MacroAssemblerARM::probe(ProbeFunction function, void* arg)
+void MacroAssembler::probe(ProbeFunction function, void* arg)
 {
     push(RegisterID::sp);
     push(RegisterID::lr);
index 2b80d24..9c89906 100644 (file)
@@ -34,7 +34,7 @@
 
 namespace JSC {
 
-class MacroAssemblerARM : public AbstractMacroAssembler<ARMAssembler, MacroAssemblerARM> {
+class MacroAssemblerARM : public AbstractMacroAssembler<ARMAssembler> {
     static const int DoubleConditionMask = 0x0f;
     static const int DoubleConditionBitSpecial = 0x10;
     COMPILE_ASSERT(!(DoubleConditionBitSpecial & DoubleConditionMask), DoubleConditionBitSpecial_should_not_interfere_with_ARMAssembler_Condition_codes);
@@ -1559,10 +1559,6 @@ public:
         ARMAssembler::relinkCall(call.dataLocation(), destination.executableAddress());
     }
 
-#if ENABLE(MASM_PROBE)
-    void probe(ProbeFunction, void* arg);
-#endif // ENABLE(MASM_PROBE)
-
 protected:
     ARMAssembler::Condition ARMCondition(RelationalCondition cond)
     {
index 954acb4..ea89f24 100644 (file)
@@ -472,7 +472,7 @@ static void arm64ProbeTrampoline(ProbeContext* context)
     }
 }
 
-void MacroAssemblerARM64::probe(ProbeFunction function, void* arg)
+void MacroAssembler::probe(ProbeFunction function, void* arg)
 {
     sub64(TrustedImm32(7 * 8), sp);
 
index c37e00b..8511e62 100644 (file)
@@ -34,7 +34,7 @@
 
 namespace JSC {
 
-class MacroAssemblerARM64 : public AbstractMacroAssembler<ARM64Assembler, MacroAssemblerARM64> {
+class MacroAssemblerARM64 : public AbstractMacroAssembler<ARM64Assembler> {
 public:
     static const unsigned numGPRs = 32;
     static const unsigned numFPRs = 32;
@@ -3785,10 +3785,6 @@ public:
         ARM64Assembler::repatchPointer(call.dataLabelPtrAtOffset(REPATCH_OFFSET_CALL_TO_POINTER).dataLocation(), destination.executableAddress());
     }
 
-#if ENABLE(MASM_PROBE)
-    void probe(ProbeFunction, void* arg);
-#endif // ENABLE(MASM_PROBE)
-
 protected:
     ALWAYS_INLINE Jump makeBranch(ARM64Assembler::Condition cond)
     {
index 4083051..ec7a964 100644 (file)
@@ -325,7 +325,7 @@ asm (
 );
 #endif // COMPILER(GCC_OR_CLANG)
 
-void MacroAssemblerARMv7::probe(ProbeFunction function, void* arg)
+void MacroAssembler::probe(ProbeFunction function, void* arg)
 {
     push(RegisterID::lr);
     push(RegisterID::lr);
index f3fe61d..156399e 100644 (file)
@@ -33,7 +33,7 @@
 
 namespace JSC {
 
-class MacroAssemblerARMv7 : public AbstractMacroAssembler<ARMv7Assembler, MacroAssemblerARMv7> {
+class MacroAssemblerARMv7 : public AbstractMacroAssembler<ARMv7Assembler> {
     static const RegisterID dataTempRegister = ARMRegisters::ip;
     static const RegisterID addressTempRegister = ARMRegisters::r6;
 
@@ -2016,10 +2016,6 @@ public:
         ARMv7Assembler::relinkCall(call.dataLocation(), destination.executableAddress());
     }
 
-#if ENABLE(MASM_PROBE)
-    void probe(ProbeFunction, void* arg);
-#endif // ENABLE(MASM_PROBE)
-
 protected:
     ALWAYS_INLINE Jump jump()
     {
index fa05be1..8463976 100644 (file)
@@ -33,7 +33,7 @@
 
 namespace JSC {
 
-class MacroAssemblerMIPS : public AbstractMacroAssembler<MIPSAssembler, MacroAssemblerMIPS> {
+class MacroAssemblerMIPS : public AbstractMacroAssembler<MIPSAssembler> {
 public:
     typedef MIPSRegisters::FPRegisterID FPRegisterID;
     static const unsigned numGPRs = 32;
index a51f75a..a6b6825 100644 (file)
@@ -528,7 +528,7 @@ asm (
 // position before we push the ProbeContext frame. The saved rip will point to
 // the address of the instruction immediately following the probe. 
 
-void MacroAssemblerX86Common::probe(ProbeFunction function, void* arg)
+void MacroAssembler::probe(ProbeFunction function, void* arg)
 {
     push(RegisterID::esp);
     push(RegisterID::eax);
index 6acc2a9..cb1a748 100644 (file)
@@ -37,7 +37,7 @@
 
 namespace JSC {
 
-class MacroAssemblerX86Common : public AbstractMacroAssembler<X86Assembler, MacroAssemblerX86Common> {
+class MacroAssemblerX86Common : public AbstractMacroAssembler<X86Assembler> {
 public:
 #if CPU(X86_64)
     // Use this directly only if you're not generating code with it.
@@ -3870,10 +3870,6 @@ public:
         s_avxCheckState = (flags & (1 << 28)) ? CPUIDCheckState::Set : CPUIDCheckState::Clear;
     }
 
-#if ENABLE(MASM_PROBE)
-    void probe(ProbeFunction, void* arg);
-#endif // ENABLE(MASM_PROBE)
-
 protected:
     X86Assembler::Condition x86Condition(RelationalCondition cond)
     {