Title: [192334] trunk/Source/_javascript_Core
Revision
192334
Author
mark....@apple.com
Date
2015-11-11 16:41:12 -0800 (Wed, 11 Nov 2015)

Log Message

Add ability to insert probes in LLVM IR that we generate.
https://bugs.webkit.org/show_bug.cgi?id=151159

Reviewed by Geoffrey Garen.

This is done by inserting a stackmap intrinsic and emitting the probe there.

We can now insert probes that take a lambda like so:

    probe([] (CCallHelpers::ProbeContext*) {
        dataLog("Hello FTL\n");
    });

* ftl/FTLCompile.cpp:
* ftl/FTLInlineCacheDescriptor.h:
(JSC::FTL::ProbeDescriptor::ProbeDescriptor):
(JSC::FTL::ProbeDescriptor::probeFunction):
* ftl/FTLInlineCacheSize.cpp:
(JSC::FTL::sizeOfProbe):
* ftl/FTLInlineCacheSize.h:
* ftl/FTLLowerDFGToLLVM.cpp:
(JSC::FTL::DFG::LowerDFGToLLVM::probe):
* ftl/FTLState.h:

Modified Paths

Diff

Modified: trunk/Source/_javascript_Core/ChangeLog (192333 => 192334)


--- trunk/Source/_javascript_Core/ChangeLog	2015-11-12 00:29:53 UTC (rev 192333)
+++ trunk/Source/_javascript_Core/ChangeLog	2015-11-12 00:41:12 UTC (rev 192334)
@@ -1,5 +1,31 @@
 2015-11-11  Mark Lam  <mark....@apple.com>
 
+        Add ability to insert probes in LLVM IR that we generate.
+        https://bugs.webkit.org/show_bug.cgi?id=151159
+
+        Reviewed by Geoffrey Garen.
+
+        This is done by inserting a stackmap intrinsic and emitting the probe there.
+
+        We can now insert probes that take a lambda like so:
+
+            probe([] (CCallHelpers::ProbeContext*) {
+                dataLog("Hello FTL\n");
+            });
+
+        * ftl/FTLCompile.cpp:
+        * ftl/FTLInlineCacheDescriptor.h:
+        (JSC::FTL::ProbeDescriptor::ProbeDescriptor):
+        (JSC::FTL::ProbeDescriptor::probeFunction):
+        * ftl/FTLInlineCacheSize.cpp:
+        (JSC::FTL::sizeOfProbe):
+        * ftl/FTLInlineCacheSize.h:
+        * ftl/FTLLowerDFGToLLVM.cpp:
+        (JSC::FTL::DFG::LowerDFGToLLVM::probe):
+        * ftl/FTLState.h:
+
+2015-11-11  Mark Lam  <mark....@apple.com>
+
         Change probe CPUState gpr() and fpr() to return references.
         https://bugs.webkit.org/show_bug.cgi?id=151154
 

Modified: trunk/Source/_javascript_Core/ftl/FTLCompile.cpp (192333 => 192334)


--- trunk/Source/_javascript_Core/ftl/FTLCompile.cpp	2015-11-12 00:29:53 UTC (rev 192333)
+++ trunk/Source/_javascript_Core/ftl/FTLCompile.cpp	2015-11-12 00:41:12 UTC (rev 192334)
@@ -459,6 +459,36 @@
     }
 }
 
+#if ENABLE(MASM_PROBE)
+
+static void generateProbe(
+    State& state, CodeBlock* codeBlock, GeneratedFunction generatedFunction,
+    StackMaps::RecordMap& recordMap, ProbeDescriptor& ic)
+{
+    VM& vm = state.graph.m_vm;
+    size_t sizeOfIC = sizeOfProbe();
+
+    StackMaps::RecordMap::iterator iter = recordMap.find(ic.stackmapID());
+    if (iter == recordMap.end())
+        return; // It was optimized out.
+
+    CCallHelpers fastPathJIT(&vm, codeBlock);
+    Vector<StackMaps::RecordAndIndex>& records = iter->value;
+    for (unsigned i = records.size(); i--;) {
+        StackMaps::Record& record = records[i].record;
+
+        fastPathJIT.probe(ic.probeFunction());
+        CCallHelpers::Jump done = fastPathJIT.jump();
+
+        char* startOfIC = bitwise_cast<char*>(generatedFunction) + record.instructionOffset;
+        generateInlineIfPossibleOutOfLineIfNot(state, vm, codeBlock, fastPathJIT, startOfIC, sizeOfIC, "Probe", [&] (LinkBuffer& linkBuffer, CCallHelpers&, bool) {
+            linkBuffer.link(done, CodeLocationLabel(startOfIC + sizeOfIC));
+        });
+    }
+}
+
+#endif // ENABLE(MASM_PROBE)
+
 static RegisterSet usedRegistersFor(const StackMaps::Record& record)
 {
     if (Options::assumeAllRegsInFTLICAreLive())
@@ -911,6 +941,12 @@
                     state.finalizer->sideCodeLinkBuffer->locationOf(std::get<1>(tuple)));
             }
         }
+#if ENABLE(MASM_PROBE)
+        for (unsigned i = state.probes.size(); i--;) {
+            ProbeDescriptor& probe = state.probes[i];
+            generateProbe(state, codeBlock, generatedFunction, recordMap, probe);
+        }
+#endif
         for (auto& pair : exceptionJumpsToLink)
             state.finalizer->sideCodeLinkBuffer->link(pair.first, pair.second);
     }

Modified: trunk/Source/_javascript_Core/ftl/FTLInlineCacheDescriptor.h (192333 => 192334)


--- trunk/Source/_javascript_Core/ftl/FTLInlineCacheDescriptor.h	2015-11-12 00:29:53 UTC (rev 192333)
+++ trunk/Source/_javascript_Core/ftl/FTLInlineCacheDescriptor.h	2015-11-12 00:41:12 UTC (rev 192334)
@@ -175,6 +175,22 @@
     RefPtr<LazySlowPathLinkerTask> m_linker;
 };
 
+#if ENABLE(MASM_PROBE)
+class ProbeDescriptor : public InlineCacheDescriptor {
+public:
+    ProbeDescriptor(unsigned stackmapID, std::function<void (CCallHelpers::ProbeContext*)> probeFunction)
+        : InlineCacheDescriptor(stackmapID, codeOrigin(), nullptr)
+        , m_probeFunction(probeFunction)
+    {
+    }
+
+    std::function<void (CCallHelpers::ProbeContext*)>& probeFunction() { return m_probeFunction; }
+
+private:
+    std::function<void (CCallHelpers::ProbeContext*)> m_probeFunction;
+};
+#endif // ENABLE(MASM_PROBE)
+
 } } // namespace JSC::FTL
 
 #endif // ENABLE(FTL_JIT)

Modified: trunk/Source/_javascript_Core/ftl/FTLInlineCacheSize.cpp (192333 => 192334)


--- trunk/Source/_javascript_Core/ftl/FTLInlineCacheSize.cpp	2015-11-12 00:29:53 UTC (rev 192333)
+++ trunk/Source/_javascript_Core/ftl/FTLInlineCacheSize.cpp	2015-11-12 00:41:12 UTC (rev 192334)
@@ -145,6 +145,13 @@
 #endif
 }
 
+#if ENABLE(MASM_PROBE)
+size_t sizeOfProbe()
+{
+    return 132; // Based on ARM64.
+}
+#endif
+
 size_t sizeOfICFor(Node* node)
 {
     switch (node->op()) {

Modified: trunk/Source/_javascript_Core/ftl/FTLInlineCacheSize.h (192333 => 192334)


--- trunk/Source/_javascript_Core/ftl/FTLInlineCacheSize.h	2015-11-12 00:29:53 UTC (rev 192333)
+++ trunk/Source/_javascript_Core/ftl/FTLInlineCacheSize.h	2015-11-12 00:41:12 UTC (rev 192334)
@@ -47,6 +47,9 @@
 size_t sizeOfConstructForwardVarargs();
 size_t sizeOfIn();
 size_t sizeOfArithSub();
+#if ENABLE(MASM_PROBE)
+size_t sizeOfProbe();
+#endif
 
 size_t sizeOfICFor(DFG::Node*);
 

Modified: trunk/Source/_javascript_Core/ftl/FTLLowerDFGToLLVM.cpp (192333 => 192334)


--- trunk/Source/_javascript_Core/ftl/FTLLowerDFGToLLVM.cpp	2015-11-12 00:29:53 UTC (rev 192333)
+++ trunk/Source/_javascript_Core/ftl/FTLLowerDFGToLLVM.cpp	2015-11-12 00:41:12 UTC (rev 192334)
@@ -9397,6 +9397,15 @@
         return abstractStructure(edge.node());
     }
     
+#if ENABLE(MASM_PROBE)
+    void probe(std::function<void (CCallHelpers::ProbeContext*)> probeFunc)
+    {
+        uint32_t stackmapID = m_stackmapIDs++;
+        m_ftlState.probes.append(ProbeDescriptor(stackmapID, probeFunc));
+        m_out.call(m_out.stackmapIntrinsic(), m_out.constInt64(stackmapID), m_out.constInt32(sizeOfProbe()));
+    }
+#endif
+
     void crash()
     {
         crash(m_highBlock->index, m_node->index());

Modified: trunk/Source/_javascript_Core/ftl/FTLState.h (192333 => 192334)


--- trunk/Source/_javascript_Core/ftl/FTLState.h	2015-11-12 00:29:53 UTC (rev 192333)
+++ trunk/Source/_javascript_Core/ftl/FTLState.h	2015-11-12 00:41:12 UTC (rev 192334)
@@ -81,6 +81,9 @@
     SegmentedVector<CheckInDescriptor> checkIns;
     SegmentedVector<ArithSubDescriptor> arithSubs;
     SegmentedVector<LazySlowPathDescriptor> lazySlowPaths;
+#if ENABLE(MASM_PROBE)
+    SegmentedVector<ProbeDescriptor> probes;
+#endif
     Vector<JSCall> jsCalls;
     Vector<JSCallVarargs> jsCallVarargses;
     Vector<JSTailCall> jsTailCalls;
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to