Add LLINT probe() macro for X86_64.
authormark.lam@apple.com <mark.lam@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 18 Aug 2016 20:25:30 +0000 (20:25 +0000)
committermark.lam@apple.com <mark.lam@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 18 Aug 2016 20:25:30 +0000 (20:25 +0000)
https://bugs.webkit.org/show_bug.cgi?id=160968

Reviewed by Geoffrey Garen.

* llint/LowLevelInterpreter.asm:

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

Source/JavaScriptCore/ChangeLog
Source/JavaScriptCore/llint/LowLevelInterpreter.asm

index 634a512..8717e71 100644 (file)
@@ -1,5 +1,14 @@
 2016-08-18  Mark Lam  <mark.lam@apple.com>
 
+        Add LLINT probe() macro for X86_64.
+        https://bugs.webkit.org/show_bug.cgi?id=160968
+
+        Reviewed by Geoffrey Garen.
+
+        * llint/LowLevelInterpreter.asm:
+
+2016-08-18  Mark Lam  <mark.lam@apple.com>
+
         Remove unused SlotVisitor::append() variant.
         https://bugs.webkit.org/show_bug.cgi?id=160961
 
index 0d9a45a..14918b6 100644 (file)
@@ -437,6 +437,45 @@ macro assert(assertion)
     end
 end
 
+# The probe macro can be used to insert some debugging code without perturbing scalar
+# registers. Presently, the probe macro only preserves scalar registers. Hence, the
+# C probe callback function should not trash floating point registers.
+#
+# The macro you pass to probe() can pass whatever registers you like to your probe
+# callback function. However, you need to be mindful of which of the registers are
+# also used as argument registers, and ensure that you don't trash the register value
+# before storing it in the probe callback argument register that you desire.
+#
+# Here's an example of how it's used:
+#
+#     probe(
+#         macro()
+#             move cfr, a0 # pass the ExecState* as arg0.
+#             move t0, a1 # pass the value of register t0 as arg1.
+#             call _cProbeCallbackFunction # to do whatever you want.
+#         end
+#     )
+#
+if X86_64
+    macro probe(action)
+        # save all the registers that the LLInt may use.
+        push a0, a1
+        push a2, a3
+        push t0, t1
+        push t2, t3
+        push t4, t5
+
+        action()
+
+        # restore all the registers we saved previously.
+        pop t5, t4
+        pop t3, t2
+        pop t1, t0
+        pop a3, a2
+        pop a1, a0
+    end
+end
+
 macro checkStackPointerAlignment(tempReg, location)
     if ARM64 or C_LOOP or SH4
         # ARM64 will check for us!