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