Ignore:
Timestamp:
Dec 8, 2008, 5:06:14 PM (16 years ago)
Author:
[email protected]
Message:

2008-12-08 Sam Weinig <[email protected]>

Reviewed by Geoffrey Garen.

Patch for https://bugs.webkit.org/show_bug.cgi?id=22716
<rdar://problem/6428315>
Add RareData structure to CodeBlock for infrequently used auxiliary data
members.

Reduces memory on Membuster-head by ~.5MB

  • bytecode/CodeBlock.cpp: (JSC::CodeBlock::dump): (JSC::CodeBlock::dumpStatistics): (JSC::CodeBlock::mark): (JSC::CodeBlock::getHandlerForVPC): (JSC::CodeBlock::nativeExceptionCodeForHandlerVPC): (JSC::CodeBlock::shrinkToFit):
  • bytecode/CodeBlock.h: (JSC::CodeBlock::numberOfExceptionHandlers): (JSC::CodeBlock::addExceptionHandler): (JSC::CodeBlock::exceptionHandler): (JSC::CodeBlock::addFunction): (JSC::CodeBlock::function): (JSC::CodeBlock::addUnexpectedConstant): (JSC::CodeBlock::unexpectedConstant): (JSC::CodeBlock::addRegExp): (JSC::CodeBlock::regexp): (JSC::CodeBlock::numberOfImmediateSwitchJumpTables): (JSC::CodeBlock::addImmediateSwitchJumpTable): (JSC::CodeBlock::immediateSwitchJumpTable): (JSC::CodeBlock::numberOfCharacterSwitchJumpTables): (JSC::CodeBlock::addCharacterSwitchJumpTable): (JSC::CodeBlock::characterSwitchJumpTable): (JSC::CodeBlock::numberOfStringSwitchJumpTables): (JSC::CodeBlock::addStringSwitchJumpTable): (JSC::CodeBlock::stringSwitchJumpTable): (JSC::CodeBlock::evalCodeCache): (JSC::CodeBlock::createRareDataIfNecessary):
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/JavaScriptCore/bytecode/CodeBlock.cpp

    r39113 r39116  
    262262    }
    263263
    264     if (!m_unexpectedConstants.isEmpty()) {
     264    if (m_rareData && !m_rareData->m_unexpectedConstants.isEmpty()) {
    265265        printf("\nUnexpected Constants:\n");
    266266        size_t i = 0;
    267267        do {
    268             printf("  k%u = %s\n", static_cast<unsigned>(i), valueToSourceString(exec, m_unexpectedConstants[i]).ascii());
     268            printf("  k%u = %s\n", static_cast<unsigned>(i), valueToSourceString(exec, m_rareData->m_unexpectedConstants[i]).ascii());
    269269            ++i;
    270         } while (i < m_unexpectedConstants.size());
     270        } while (i < m_rareData->m_unexpectedConstants.size());
    271271    }
    272272   
    273     if (!m_regexps.isEmpty()) {
     273    if (m_rareData && !m_rareData->m_regexps.isEmpty()) {
    274274        printf("\nm_regexps:\n");
    275275        size_t i = 0;
    276276        do {
    277             printf("  re%u = %s\n", static_cast<unsigned>(i), regexpToSourceString(m_regexps[i].get()).ascii());
     277            printf("  re%u = %s\n", static_cast<unsigned>(i), regexpToSourceString(m_rareData->m_regexps[i].get()).ascii());
    278278            ++i;
    279         } while (i < m_regexps.size());
     279        } while (i < m_rareData->m_regexps.size());
    280280    }
    281281
     
    298298    }
    299299 
    300     if (!m_exceptionHandlers.isEmpty()) {
     300    if (m_rareData && !m_rareData->m_exceptionHandlers.isEmpty()) {
    301301        printf("\nException Handlers:\n");
    302302        unsigned i = 0;
    303303        do {
    304             printf("\t %d: { start: [%4d] end: [%4d] target: [%4d] }\n", i + 1, m_exceptionHandlers[i].start, m_exceptionHandlers[i].end, m_exceptionHandlers[i].target);
     304            printf("\t %d: { start: [%4d] end: [%4d] target: [%4d] }\n", i + 1, m_rareData->m_exceptionHandlers[i].start, m_rareData->m_exceptionHandlers[i].end, m_rareData->m_exceptionHandlers[i].target);
    305305            ++i;
    306         } while (i < m_exceptionHandlers.size());
     306        } while (i < m_rareData->m_exceptionHandlers.size());
    307307    }
    308308   
    309     if (!m_immediateSwitchJumpTables.isEmpty()) {
     309    if (m_rareData && !m_rareData->m_immediateSwitchJumpTables.isEmpty()) {
    310310        printf("Immediate Switch Jump Tables:\n");
    311311        unsigned i = 0;
     
    313313            printf("  %1d = {\n", i);
    314314            int entry = 0;
    315             Vector<int32_t>::const_iterator end = m_immediateSwitchJumpTables[i].branchOffsets.end();
    316             for (Vector<int32_t>::const_iterator iter = m_immediateSwitchJumpTables[i].branchOffsets.begin(); iter != end; ++iter, ++entry) {
     315            Vector<int32_t>::const_iterator end = m_rareData->m_immediateSwitchJumpTables[i].branchOffsets.end();
     316            for (Vector<int32_t>::const_iterator iter = m_rareData->m_immediateSwitchJumpTables[i].branchOffsets.begin(); iter != end; ++iter, ++entry) {
    317317                if (!*iter)
    318318                    continue;
    319                 printf("\t\t%4d => %04d\n", entry + m_immediateSwitchJumpTables[i].min, *iter);
     319                printf("\t\t%4d => %04d\n", entry + m_rareData->m_immediateSwitchJumpTables[i].min, *iter);
    320320            }
    321321            printf("      }\n");
    322322            ++i;
    323         } while (i < m_immediateSwitchJumpTables.size());
     323        } while (i < m_rareData->m_immediateSwitchJumpTables.size());
    324324    }
    325325   
    326     if (!m_characterSwitchJumpTables.isEmpty()) {
     326    if (m_rareData && !m_rareData->m_characterSwitchJumpTables.isEmpty()) {
    327327        printf("\nCharacter Switch Jump Tables:\n");
    328328        unsigned i = 0;
     
    330330            printf("  %1d = {\n", i);
    331331            int entry = 0;
    332             Vector<int32_t>::const_iterator end = m_characterSwitchJumpTables[i].branchOffsets.end();
    333             for (Vector<int32_t>::const_iterator iter = m_characterSwitchJumpTables[i].branchOffsets.begin(); iter != end; ++iter, ++entry) {
     332            Vector<int32_t>::const_iterator end = m_rareData->m_characterSwitchJumpTables[i].branchOffsets.end();
     333            for (Vector<int32_t>::const_iterator iter = m_rareData->m_characterSwitchJumpTables[i].branchOffsets.begin(); iter != end; ++iter, ++entry) {
    334334                if (!*iter)
    335335                    continue;
    336                 ASSERT(!((i + m_characterSwitchJumpTables[i].min) & ~0xFFFF));
    337                 UChar ch = static_cast<UChar>(entry + m_characterSwitchJumpTables[i].min);
     336                ASSERT(!((i + m_rareData->m_characterSwitchJumpTables[i].min) & ~0xFFFF));
     337                UChar ch = static_cast<UChar>(entry + m_rareData->m_characterSwitchJumpTables[i].min);
    338338                printf("\t\t\"%s\" => %04d\n", UString(&ch, 1).ascii(), *iter);
    339339        }
    340340            printf("      }\n");
    341341            ++i;
    342         } while (i < m_characterSwitchJumpTables.size());
     342        } while (i < m_rareData->m_characterSwitchJumpTables.size());
    343343    }
    344344   
    345     if (!m_stringSwitchJumpTables.isEmpty()) {
     345    if (m_rareData && !m_rareData->m_stringSwitchJumpTables.isEmpty()) {
    346346        printf("\nString Switch Jump Tables:\n");
    347347        unsigned i = 0;
    348348        do {
    349349            printf("  %1d = {\n", i);
    350             StringJumpTable::StringOffsetTable::const_iterator end = m_stringSwitchJumpTables[i].offsetTable.end();
    351             for (StringJumpTable::StringOffsetTable::const_iterator iter = m_stringSwitchJumpTables[i].offsetTable.begin(); iter != end; ++iter)
     350            StringJumpTable::StringOffsetTable::const_iterator end = m_rareData->m_stringSwitchJumpTables[i].offsetTable.end();
     351            for (StringJumpTable::StringOffsetTable::const_iterator iter = m_rareData->m_stringSwitchJumpTables[i].offsetTable.begin(); iter != end; ++iter)
    352352                printf("\t\t\"%s\" => %04d\n", UString(iter->first).ascii(), iter->second.branchOffset);
    353353            printf("      }\n");
    354354            ++i;
    355         } while (i < m_stringSwitchJumpTables.size());
     355        } while (i < m_rareData->m_stringSwitchJumpTables.size());
    356356    }
    357357
     
    384384            int r0 = (++it)->u.operand;
    385385            int k0 = (++it)->u.operand;
    386             printf("[%4d] unexpected_load\t %s, %s\n", location, registerName(r0).c_str(), constantName(exec, k0, m_unexpectedConstants[k0]).c_str());
     386            printf("[%4d] unexpected_load\t %s, %s\n", location, registerName(r0).c_str(), constantName(exec, k0, unexpectedConstant(k0)).c_str());
    387387            break;
    388388        }
     
    402402            int r0 = (++it)->u.operand;
    403403            int re0 = (++it)->u.operand;
    404             printf("[%4d] new_regexp\t %s, %s\n", location, registerName(r0).c_str(), regexpName(re0, m_regexps[re0].get()).c_str());
     404            printf("[%4d] new_regexp\t %s, %s\n", location, registerName(r0).c_str(), regexpName(re0, regexp(re0)).c_str());
    405405            break;
    406406        }
     
    916916            int errorType = (++it)->u.operand;
    917917            int k0 = (++it)->u.operand;
    918             printf("[%4d] new_error\t %s, %d, %s\n", location, registerName(r0).c_str(), errorType, constantName(exec, k0, m_unexpectedConstants[k0]).c_str());
     918            printf("[%4d] new_error\t %s, %d, %s\n", location, registerName(r0).c_str(), errorType, constantName(exec, k0, unexpectedConstant(k0)).c_str());
    919919            break;
    920920        }
     
    972972    macro(expressionInfo) \
    973973    macro(lineInfo) \
     974
     975#define FOR_EACH_MEMBER_VECTOR_RARE_DATA(macro) \
    974976    macro(regexps) \
    975977    macro(functions) \
     
    986988    #define DEFINE_VARS(name) size_t name##IsNotEmpty = 0;
    987989        FOR_EACH_MEMBER_VECTOR(DEFINE_VARS)
     990        FOR_EACH_MEMBER_VECTOR_RARE_DATA(DEFINE_VARS);
    988991    #undef DEFINE_VARS
    989992
     
    992995    size_t evalCodeCacheIsNotEmpty = 0;
    993996
     997    size_t hasRareData = 0;
     998
    994999    HashSet<CodeBlock*>::const_iterator end = liveCodeBlockSet.end();
    9951000    for (HashSet<CodeBlock*>::const_iterator it = liveCodeBlockSet.begin(); it != end; ++it) {
     
    10021007        if (!codeBlock->m_jitReturnAddressVPCMap.isEmpty())
    10031008            jitReturnAddressVPCMapIsNotEmpty++;
    1004         if (!codeBlock->m_evalCodeCache.isEmpty())
    1005             evalCodeCacheIsNotEmpty++;
     1009
     1010        if (codeBlock->m_rareData) {
     1011            hasRareData++;
     1012            #define GET_STATS(name) if (!codeBlock->m_rareData->m_##name.isEmpty()) { name##IsNotEmpty++; }
     1013                FOR_EACH_MEMBER_VECTOR_RARE_DATA(GET_STATS)
     1014            #undef GET_STATS
     1015
     1016            if (!codeBlock->m_rareData->m_evalCodeCache.isEmpty())
     1017                evalCodeCacheIsNotEmpty++;
     1018        }
    10061019    }
    10071020
     
    10091022    printf("Size of a single CodeBlock [sizeof(CodeBlock)]: %zu\n", sizeof(CodeBlock));
    10101023
     1024    printf("Number of CodeBlocks with rare data: %zu\n", hasRareData);
     1025
    10111026    #define PRINT_STATS(name) printf("Number of CodeBlocks with " #name ": %zu\n", name##IsNotEmpty);
    10121027        FOR_EACH_MEMBER_VECTOR(PRINT_STATS)
     1028        FOR_EACH_MEMBER_VECTOR_RARE_DATA(PRINT_STATS)
    10131029    #undef PRINT_STATS
     1030
    10141031    printf("Number of CodeBlocks with jitReturnAddressVPCMap: %zu\n", jitReturnAddressVPCMapIsNotEmpty);
    10151032    printf("Number of CodeBlocks with evalCodeCache: %zu\n", evalCodeCacheIsNotEmpty);
     
    11641181            m_constantRegisters[i].mark();
    11651182
    1166     for (size_t i = 0; i < m_unexpectedConstants.size(); ++i)
    1167         if (!m_unexpectedConstants[i]->marked())
    1168             m_unexpectedConstants[i]->mark();
    1169 
    1170     for (size_t i = 0; i < m_functions.size(); ++i)
    1171         m_functions[i]->body()->mark();
    1172 
    11731183    for (size_t i = 0; i < m_functionExpressions.size(); ++i)
    11741184        m_functionExpressions[i]->body()->mark();
     1185
     1186    if (m_rareData) {
     1187        for (size_t i = 0; i < m_rareData->m_functions.size(); ++i)
     1188            m_rareData->m_functions[i]->body()->mark();
     1189
     1190        for (size_t i = 0; i < m_rareData->m_unexpectedConstants.size(); ++i) {
     1191            if (!m_rareData->m_unexpectedConstants[i]->marked())
     1192                m_rareData->m_unexpectedConstants[i]->mark();
     1193        }
     1194    }
    11751195}
    11761196
    11771197bool CodeBlock::getHandlerForVPC(const Instruction* vPC, Instruction*& target, int& scopeDepth)
    11781198{
    1179     Vector<HandlerInfo>::iterator ptr = m_exceptionHandlers.begin();
    1180     Vector<HandlerInfo>::iterator end = m_exceptionHandlers.end();
     1199    if (!m_rareData)
     1200        return false;
     1201
     1202    Vector<HandlerInfo>::iterator ptr = m_rareData->m_exceptionHandlers.begin();
     1203    Vector<HandlerInfo>::iterator end = m_rareData->m_exceptionHandlers.end();
    11811204    unsigned addressOffset = vPC - m_instructions.begin();
    11821205    ASSERT(addressOffset < m_instructions.size());
     
    11961219void* CodeBlock::nativeExceptionCodeForHandlerVPC(const Instruction* handlerVPC)
    11971220{
    1198     Vector<HandlerInfo>::iterator ptr = m_exceptionHandlers.begin();
    1199     Vector<HandlerInfo>::iterator end = m_exceptionHandlers.end();
     1221    if (!m_rareData)
     1222        return 0;
     1223
     1224    Vector<HandlerInfo>::iterator ptr = m_rareData->m_exceptionHandlers.begin();
     1225    Vector<HandlerInfo>::iterator end = m_rareData->m_exceptionHandlers.end();
    12001226   
    12011227    for (; ptr != end; ++ptr) {
     
    12761302    m_callLinkInfos.shrinkToFit();
    12771303    m_linkedCallerList.shrinkToFit();
    1278 
    1279     m_exceptionHandlers.shrinkToFit();
    12801304    m_expressionInfo.shrinkToFit();
    12811305    m_lineInfo.shrinkToFit();
    1282 
    12831306    m_identifiers.shrinkToFit();
    1284     m_functions.shrinkToFit();
    12851307    m_functionExpressions.shrinkToFit();
    12861308    m_constantRegisters.shrinkToFit();
    1287     m_unexpectedConstants.shrinkToFit();
    1288     m_regexps.shrinkToFit();
    1289 
    1290     m_immediateSwitchJumpTables.shrinkToFit();
    1291     m_characterSwitchJumpTables.shrinkToFit();
    1292     m_stringSwitchJumpTables.shrinkToFit();
     1309
     1310    if (m_rareData) {
     1311        m_rareData->m_exceptionHandlers.shrinkToFit();
     1312        m_rareData->m_functions.shrinkToFit();
     1313        m_rareData->m_unexpectedConstants.shrinkToFit();
     1314        m_rareData->m_regexps.shrinkToFit();
     1315        m_rareData->m_immediateSwitchJumpTables.shrinkToFit();
     1316        m_rareData->m_characterSwitchJumpTables.shrinkToFit();
     1317        m_rareData->m_stringSwitchJumpTables.shrinkToFit();
     1318    }
    12931319}
    12941320
Note: See TracChangeset for help on using the changeset viewer.