Title: [173770] trunk/Source/WebCore
Revision
173770
Author
[email protected]
Date
2014-09-19 13:26:56 -0700 (Fri, 19 Sep 2014)

Log Message

CSS JIT: allocate the minimum required register count in debug
https://bugs.webkit.org/show_bug.cgi?id=136933

Patch by Benjamin Poulain <[email protected]> on 2014-09-19
Reviewed by Andreas Kling.

It is hard to catch bugs of minimumRegisterRequirements() because every CPU has a different
number of registers available by default.

This patch aims at improving testing by creating artificial register pressure when running
in debug. When running in debug, we no longer allocate all the available registers right away.
Instead, we allocate just enough to satisfy minimumRegisterRequirements().

The expectation with this is that under-allocation would be detected quicker since they would
crash debug builds.

* cssjit/RegisterAllocator.h:
(WebCore::RegisterAllocator::RegisterAllocator):
(WebCore::RegisterAllocator::reserveCallerSavedRegisters):
(WebCore::RegisterAllocator::availableRegisterCount): Deleted.
* cssjit/SelectorCompiler.cpp:
(WebCore::SelectorCompiler::SelectorCodeGenerator::generateSelectorChecker):

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (173769 => 173770)


--- trunk/Source/WebCore/ChangeLog	2014-09-19 20:26:07 UTC (rev 173769)
+++ trunk/Source/WebCore/ChangeLog	2014-09-19 20:26:56 UTC (rev 173770)
@@ -1,5 +1,29 @@
 2014-09-19  Benjamin Poulain  <[email protected]>
 
+        CSS JIT: allocate the minimum required register count in debug
+        https://bugs.webkit.org/show_bug.cgi?id=136933
+
+        Reviewed by Andreas Kling.
+
+        It is hard to catch bugs of minimumRegisterRequirements() because every CPU has a different
+        number of registers available by default.
+
+        This patch aims at improving testing by creating artificial register pressure when running
+        in debug. When running in debug, we no longer allocate all the available registers right away.
+        Instead, we allocate just enough to satisfy minimumRegisterRequirements().
+
+        The expectation with this is that under-allocation would be detected quicker since they would
+        crash debug builds.
+
+        * cssjit/RegisterAllocator.h:
+        (WebCore::RegisterAllocator::RegisterAllocator):
+        (WebCore::RegisterAllocator::reserveCallerSavedRegisters):
+        (WebCore::RegisterAllocator::availableRegisterCount): Deleted.
+        * cssjit/SelectorCompiler.cpp:
+        (WebCore::SelectorCompiler::SelectorCodeGenerator::generateSelectorChecker):
+
+2014-09-19  Benjamin Poulain  <[email protected]>
+
         Add a size check for CSSSelector
         https://bugs.webkit.org/show_bug.cgi?id=136882
 

Modified: trunk/Source/WebCore/cssjit/RegisterAllocator.h (173769 => 173770)


--- trunk/Source/WebCore/cssjit/RegisterAllocator.h	2014-09-19 20:26:07 UTC (rev 173769)
+++ trunk/Source/WebCore/cssjit/RegisterAllocator.h	2014-09-19 20:26:56 UTC (rev 173770)
@@ -102,7 +102,7 @@
 
 class RegisterAllocator {
 public:
-    RegisterAllocator();
+    RegisterAllocator() { }
     ~RegisterAllocator();
 
     unsigned availableRegisterCount() const { return m_registers.size(); }
@@ -154,6 +154,19 @@
         m_registers.append(registerID);
     }
 
+    unsigned reserveCallerSavedRegisters(unsigned count)
+    {
+#ifdef NDEBUG
+        UNUSED_PARAM(count);
+        unsigned numberToAllocate = WTF_ARRAY_LENGTH(callerSavedRegisters);
+#else
+        unsigned numberToAllocate = std::min<unsigned>(WTF_ARRAY_LENGTH(callerSavedRegisters), count);
+#endif
+        for (unsigned i = 0; i < numberToAllocate; ++i)
+            m_registers.append(callerSavedRegisters[i]);
+        return numberToAllocate;
+    }
+
     const Vector<JSC::MacroAssembler::RegisterID, calleeSavedRegisterCount>& reserveCalleeSavedRegisters(unsigned count)
     {
         RELEASE_ASSERT(count <= WTF_ARRAY_LENGTH(calleeSavedRegisters));
@@ -247,12 +260,6 @@
     {
     }
 };
-    
-inline RegisterAllocator::RegisterAllocator()
-{
-    for (unsigned i = 0; i < WTF_ARRAY_LENGTH(callerSavedRegisters); ++i)
-        m_registers.append(callerSavedRegisters[i]);
-}
 
 inline RegisterAllocator::~RegisterAllocator()
 {

Modified: trunk/Source/WebCore/cssjit/SelectorCompiler.cpp (173769 => 173770)


--- trunk/Source/WebCore/cssjit/SelectorCompiler.cpp	2014-09-19 20:26:07 UTC (rev 173769)
+++ trunk/Source/WebCore/cssjit/SelectorCompiler.cpp	2014-09-19 20:26:56 UTC (rev 173770)
@@ -1351,14 +1351,6 @@
 
 void SelectorCodeGenerator::generateSelectorChecker()
 {
-    StackAllocator::StackReferenceVector calleeSavedRegisterStackReferences;
-    bool reservedCalleeSavedRegisters = false;
-    unsigned availableRegisterCount = m_registerAllocator.availableRegisterCount();
-    unsigned minimumRegisterCountForAttributes = minimumRegisterRequirements(m_selectorFragments);
-#if CSS_SELECTOR_JIT_DEBUGGING
-    dataLogF("Compiling with minimum required register count %u\n", minimumRegisterCountForAttributes);
-#endif
-
     Assembler::JumpList failureOnFunctionEntry;
     // Test selector's pseudo element equals to requested PseudoId.
     if (m_selectorContext != SelectorContext::QuerySelector && m_functionType == FunctionType::SelectorCheckerWithCheckingContext) {
@@ -1366,12 +1358,20 @@
         generateRequestedPseudoElementEqualsToSelectorPseudoElement(failureOnFunctionEntry, m_selectorFragments.first(), checkingContextRegister);
     }
 
+    unsigned minimumRegisterCount = minimumRegisterRequirements(m_selectorFragments);
+    unsigned availableRegisterCount = m_registerAllocator.reserveCallerSavedRegisters(minimumRegisterCount);
+#if CSS_SELECTOR_JIT_DEBUGGING
+    dataLogF("Compiling with minimum required register count %u\n", minimumRegisterCount);
+#endif
+
     bool needsEpilogue = generatePrologue();
 
-    ASSERT(minimumRegisterCountForAttributes <= maximumRegisterCount);
-    if (availableRegisterCount < minimumRegisterCountForAttributes) {
+    StackAllocator::StackReferenceVector calleeSavedRegisterStackReferences;
+    bool reservedCalleeSavedRegisters = false;
+    ASSERT(minimumRegisterCount <= maximumRegisterCount);
+    if (availableRegisterCount < minimumRegisterCount) {
         reservedCalleeSavedRegisters = true;
-        calleeSavedRegisterStackReferences = m_stackAllocator.push(m_registerAllocator.reserveCalleeSavedRegisters(minimumRegisterCountForAttributes - availableRegisterCount));
+        calleeSavedRegisterStackReferences = m_stackAllocator.push(m_registerAllocator.reserveCalleeSavedRegisters(minimumRegisterCount - availableRegisterCount));
     }
 
     m_registerAllocator.allocateRegister(elementAddressRegister);
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to