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;